Чи є спосіб отримати визначення подання з SQL Server за допомогою простого ADO?


89

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

Основна взаємодія з наведеними таблицями відбувається за допомогою декількох подань; хоча OpenSchema()здатний повернути визначення стовпців для подання так само, як повертає визначення стовпців для таблиці, відсутній важливий біт інформації - до якої таблиці та стовпця в базових таблицях відображається стовпець у поданні.

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

Чи є спосіб отримати цю інформацію для конфігурації подання за допомогою ADO, або таким чином, щоб зазначити "ColumnX відображається в ColumnY в таблиці Z", або у формі фактичної команди SQL, яка використовується для створення подання?

Відповіді:


161

Яка версія 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

Корпорація Майкрософт перелічила такі методи отримання визначення View: 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'

Ця версія повертає подання, розбите на кілька записів, що містять 4000 символів кожен. (Тестується в SQL Server 2014.)
Бен,


3

Ви можете отримати деталі таблиці / перегляду через запит нижче.

Для таблиці: sp_help ім'я_таблиці Для перегляду: ім'я_перегляду sp_help


0
SELECT definition, uses_ansi_nulls, uses_quoted_identifier, is_schema_bound  
FROM sys.sql_modules  
WHERE object_id = OBJECT_ID('your View Name');  
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.