Есть ли способ получить определение представления из SQL Server с помощью простого ADO?

89

Я успешно извлекаю определения столбцов из баз данных, размещенных на сервере SQL, с помощью OpenSchema()вызова ADO Connection в его различных воплощениях, поэтому я могу программно воссоздать эти таблицы в другой базе данных SQL. Все идет нормально.

Основное взаимодействие с приведенными выше таблицами происходит с использованием нескольких представлений; хотя OpenSchema()может возвращать определения столбцов для представления таким же образом, как и определения столбцов для таблицы, отсутствует важный бит информации - какой таблице и столбцу в базовых таблицах сопоставлен столбец в представлении.

Я попытался получить доступ к команде SQL, использованной для создания представления с помощью представлений каталога ADOX, но оказалось, что используемый нами драйвер OLEDB для SQL Server не поддерживает эту функцию.

Есть ли способ получить эту информацию для конфигурации представления через ADO, либо способом, который гласит, что «ColumnX сопоставляется с ColumnY в таблице Z», либо в форме фактической команды SQL, используемой для создания представления?

Тимо Гойш
источник

Ответы:

160

Какая версия SQL Server?

Для SQL Server 2005 и более поздних версий вы можете получить сценарий SQL, используемый для создания представления, например:

select definition
from sys.objects     o
join sys.sql_modules m on m.object_id = o.object_id
where o.object_id = object_id( 'dbo.MyView')
  and o.type      = 'V'

Это возвращает единственную строку, содержащую сценарий, используемый для создания / изменения представления.

В других столбцах таблицы рассказывается об опциях, имевшихся на момент компиляции представления.

Предостережения

  • Если представление было изменено в последний раз с помощью ALTER VIEW, то сценарий будет оператором ALTER VIEW, а не оператором CREATE VIEW.

  • Скрипт отражает имя в том виде, в каком оно было создано. Единственный раз, когда он обновляется, - это если вы выполняете ALTER VIEW или отбрасываете и воссоздаете представление с помощью CREATE VIEW. Если представление было переименовано (например, через sp_rename) или право собственности было передано другой схеме, полученный вами сценарий будет отражать исходный оператор CREATE / ALTER VIEW: он не будет отражать текущее имя объекта.

  • Некоторые инструменты обрезают вывод. Например, программа командной строки MS-SQL sqlcmd.exe усекает данные до 255 символов. Вы можете передать параметр, -y Nчтобы получить результат с помощью Nсимволов.

Николас Кэри
источник
8
SQL-запрос из ответа можно немного упростить:select m.definition from sys.sql_modules m where m.object_id = object_id('dbo.MyView', 'V')
Иван
9
еще одно предостережение: вам, вероятно, потребуются права для просмотра определения. Я получаю за них NULL.
rveach
1
@schlamar, если вы видите только первые 255 символов, вы неправильно конвертируете столбец результата. Схема для sys.sql_modulesопределяет столбец следующим образом:definition nvarchar(max) SQL text that defines this module. NULL = Encrypted.
Николас Кэри
1
@schlamar, вы также можете заметить, что если вы используете SSMS / Query Analyzer, если вы выполняете результаты запроса в виде текста (а не сетки), по умолчанию [n][var]charданные обрезаются до 256 символов. Вы можете изменить это в меню на Query..Query Options...& mdash; В открывшемся модальном диалоговом окне перейдите к Results>Textузлу в дереве слева.
Николас Кэри
1
Я использую инструмент командной строки MS-SQL (sqlcmd.exe). Он также усекает данные. Мне пришлось передать параметр -y N, чтобы получить больше данных (действительно MS?). Так что спасибо, что указали мне правильное направление.
schlamar
24

Microsoft перечислила следующие методы получения определения представления: http://technet.microsoft.com/en-us/library/ms175067.aspx


USE AdventureWorks2012;
GO
SELECT definition, uses_ansi_nulls, uses_quoted_identifier, is_schema_bound
FROM sys.sql_modules
WHERE object_id = OBJECT_ID('HumanResources.vEmployee'); 
GO

USE AdventureWorks2012; 
GO
SELECT OBJECT_DEFINITION (OBJECT_ID('HumanResources.vEmployee')) 
AS ObjectDefinition; 
GO

EXEC sp_helptext 'HumanResources.vEmployee';
Дэйв Алджер
источник
12

Для пользователей SQL 2000 настоящая команда, которая предоставит эту информацию:

select c.text
from sysobjects     o
join syscomments    c on c.id = o.id
where o.name = '<view_name_here>'
  and o.type      = 'V'
TravelinGuy
источник
Эта версия возвращает представление, разбитое на несколько записей по 4000 символов каждая. (Проверено в SQL Server 2014.)
Бен,
7
SELECT object_definition (OBJECT_ID(N'dbo.vEmployee'))
STiAT
источник
3

Вы можете получить подробную информацию о таблице / просмотре с помощью запроса ниже.

Для таблицы: sp_help table_name Для представления: sp_help view_name

vkstream
источник
0
SELECT definition, uses_ansi_nulls, uses_quoted_identifier, is_schema_bound  
FROM sys.sql_modules  
WHERE object_id = OBJECT_ID('your View Name');  
Боско Хан
источник