Czy istnieje sposób na pobranie definicji widoku z serwera SQL przy użyciu zwykłego obiektu ADO?


89

Z powodzeniem wyodrębniam definicje kolumn z baz danych hostowanych na serwerze SQL przy użyciu OpenSchema()wywołania ADO Connection w różnych jego wcieleniach, dzięki czemu mogę programowo odtworzyć te tabele w innej bazie danych SQL. Na razie w porządku.

Główna interakcja z powyższymi tabelami odbywa się przy użyciu wielu widoków; chociaż OpenSchema()jest w stanie zwrócić definicje kolumn dla widoku w ten sam sposób, w jaki zwraca definicje kolumn dla tabeli, brakuje kluczowej części informacji - do której tabeli i kolumny w tabelach bazowych jest odwzorowywana kolumna w widoku.

Próbowałem uzyskać dostęp do polecenia SQL używanego do tworzenia widoku za pomocą widoków katalogu ADOX, ale wydaje się, że sterownik OLEDB dla SQL Server, którego używamy, nie obsługuje tej funkcji.

Czy istnieje sposób, aby uzyskać te informacje dotyczące konfiguracji widoku za pośrednictwem ADO, czy to w sposób, który stwierdza, że ​​„KolumnaX odwzorowuje kolumnęY w tabeli Z” lub w postaci rzeczywistego polecenia SQL użytego do utworzenia widoku?

Odpowiedzi:


160

Która wersja programu SQL Server?

W przypadku programu SQL Server 2005 i nowszych można uzyskać skrypt SQL używany do tworzenia widoku w następujący sposób:

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'

Zwraca pojedynczy wiersz zawierający skrypt użyty do utworzenia / zmiany widoku.

Inne kolumny w tabeli informują o opcjach istniejących w momencie kompilacji widoku.

Ostrzeżenia

  • Jeśli widok był ostatnio modyfikowany za pomocą ALTER VIEW, skrypt będzie raczej instrukcją ALTER VIEW niż instrukcją CREATE VIEW.

  • Skrypt odzwierciedla nazwę w takiej postaci, w jakiej został utworzony. Jedynym momentem, w którym zostanie zaktualizowany, jest wykonanie ALTER VIEW lub porzucenie i ponowne utworzenie widoku za pomocą CREATE VIEW. Jeśli nazwa widoku została zmieniona (np. Przez sp_rename) lub własność została przeniesiona do innego schematu, otrzymany skrypt będzie odzwierciedlał oryginalną instrukcję CREATE / ALTER VIEW: nie będzie odzwierciedlać aktualnej nazwy obiektu.

  • Niektóre narzędzia obcinają dane wyjściowe. Na przykład narzędzie wiersza poleceń MS-SQL sqlcmd.exe obcina dane na 255 znaków. Możesz przekazać parametr, -y Naby uzyskać wynik za pomocą Nznaków.


8
Zapytanie SQL z odpowiedzi można nieco uprościć:select m.definition from sys.sql_modules m where m.object_id = object_id('dbo.MyView', 'V')
Ivan

9
innym zastrzeżeniem jest to, że prawdopodobnie potrzebujesz odpowiednich uprawnień, aby wyświetlić definicję. Dostaję dla nich NULL.
rveach

1
@schlamar, jeśli widzisz tylko pierwsze 255 znaków, nieprawidłowo konwertujesz kolumnę wyników. Schemat dla sys.sql_modulesdefiniuje kolumnę w następujący sposób:definition nvarchar(max) SQL text that defines this module. NULL = Encrypted.
Nicholas Carey

1
@schlamar, możesz również zauważyć, że jeśli używasz programu SSMS / Query Analyzer, jeśli wyniki zapytania są wyświetlane jako tekst (zamiast siatki), domyślnie [n][var]chardane są obcinane do 256 znaków. Możesz to zmienić za pomocą menu pod adresem Query..Query Options...& mdash; W następnym modalnym oknie dialogowym przejdź do Results>Textwęzła w kontrolce drzewa po lewej stronie.
Nicholas Carey

1
Używam narzędzia wiersza poleceń MS-SQL (sqlcmd.exe). Obcina też dane. Musiałem przekazać parametr -y N, aby uzyskać więcej danych (naprawdę MS?). Więc dziękuję za wskazanie mi właściwego kierunku.
schlamar

24

Firma Microsoft wymieniła następujące metody uzyskiwania definicji widoku: 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

W przypadku użytkowników SQL 2000 rzeczywiste polecenie, które dostarczy te informacje, to:

select c.text
from sysobjects     o
join syscomments    c on c.id = o.id
where o.name = '<view_name_here>'
  and o.type      = 'V'

Ta wersja zwraca widok podzielony na wiele rekordów po 4000 znaków każdy. (Testowane w SQL Server 2014.)
Ben


3

Możesz uzyskać szczegóły tabeli / widoku za pomocą poniższego zapytania.

W przypadku tabeli: sp_help nazwa_tabeli W przypadku widoku: sp_help nazwa_widoku


0
SELECT definition, uses_ansi_nulls, uses_quoted_identifier, is_schema_bound  
FROM sys.sql_modules  
WHERE object_id = OBJECT_ID('your View Name');  
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.