Czy istnieje sposób na odzyskanie definicji widoku z serwera SQL za pomocą zwykłego ADO?

Z powodzeniem wydobywam definicje kolumn z baz danych hostowanych na serwerze SQL przy użyciu połączenia ADO OpenSchema() w jego różnych wcieleniach, dzięki czemu mogę programowo odtworzyć te tabele w innej bazie danych SQL. Jak na razie dobrze.

Główna interakcja z powyższymi tabelami odbywa się przy użyciu wielu widoków; podczas gdy OpenSchema() jest w stanie zwrócić definicje kolumn dla widoku w ten sam sposób, w jaki zwraca definicje kolumn dla tabeli, kluczową informacją jest missing - do której tabeli i kolumny w tabelach bazowych ma być przypisana kolumna w widoku.

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

Czy Jest jakiś sposób, aby uzyskać te informacje do konfiguracji widoku przez ADO, albo w sposób, który stwierdza "columnx maps to ColumnY in table Z" lub w postaci rzeczywistego polecenia SQL używanego do stworzyć widok?

Author: Timo Geusch, 2011-01-22

4 answers

Która wersja SQL Server?

Dla 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żywany do tworzenia / zmiany widoku.

Inne kolumny w tabeli mówią o opcjach istniejących w momencie kompilacji widoku.

Caveats

  • Jeżeli widok był ostatnio modyfikowany za pomocą Alter VIEW, wtedy skrypt będzie instrukcją ALTER VIEW zamiast instrukcji CREATE VIEW.

  • Skrypt odzwierciedla nazwę, jak został utworzony. Aktualizowany jest tylko wtedy, gdy wykonasz opcję Zmień widok lub upuść i odtworzysz go za pomocą opcji Utwórz widok. Jeśli Widok został przemianowany (np. poprzez 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ł bieżącej nazwy obiektów.

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

 115
Author: Nicholas Carey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-02 07:25:46

Microsoft wymienił następujące metody uzyskiwania definicji widoku a: 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';
 14
Author: DaveAlger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-19 19:44:30

Dla użytkowników SQL 2000, rzeczywiste polecenie, które dostarczy te informacje jest:

select c.text
from sysobjects     o
join syscomments    c on c.id = o.id
where o.name = '<view_name_here>'
  and o.type      = 'V'
 12
Author: TravelinGuy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-30 15:37:44
SELECT object_definition (OBJECT_ID(N'dbo.vEmployee'))
 5
Author: user1967725,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-24 08:34:45