Gibt es eine Möglichkeit, die Ansichtsdefinition mit einfachem ADO von einem SQL Server abzurufen?

86

Ich extrahiere erfolgreich Spaltendefinitionen aus Datenbanken, die auf einem SQL Server gehostet werden, indem OpenSchema()ich den ADO Connection- Aufruf in seinen verschiedenen Inkarnationen verwende, damit ich diese Tabellen programmgesteuert in einer anderen SQL-Datenbank neu erstellen kann. So weit, ist es gut.

Die Hauptinteraktion mit den obigen Tabellen erfolgt über mehrere Ansichten. Während OpenSchema()die Spaltendefinitionen für die Ansicht auf dieselbe Weise zurückgegeben werden können wie die Spaltendefinitionen für eine Tabelle, fehlen wichtige Informationen - welcher Tabelle und Spalte in den zugrunde liegenden Tabellen die Spalte in der Ansicht zugeordnet ist.

Ich habe versucht, auf den SQL-Befehl zuzugreifen, der zum Erstellen der Ansicht mit ADOX-Katalogansichten verwendet wurde, aber es scheint, dass der von uns verwendete OLEDB-Treiber für SQL Server diese Funktionalität nicht unterstützt.

Gibt es eine Möglichkeit, diese Informationen für die Ansichtskonfiguration über ADO abzurufen, entweder so, dass "ColumnX in Spalte Z ColumnY zugeordnet ist" oder in Form des tatsächlichen SQL-Befehls, der zum Erstellen der Ansicht verwendet wird?

Timo Geusch
quelle

Antworten:

156

Welche Version von SQL Server?

Für SQL Server 2005 und höher können Sie das SQL-Skript abrufen, mit dem die Ansicht wie folgt erstellt wurde:

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'

Dies gibt eine einzelne Zeile zurück, die das Skript zum Erstellen / Ändern der Ansicht enthält.

Andere Spalten in der Tabelle enthalten Informationen zu Optionen, die zum Zeitpunkt der Kompilierung der Ansicht vorhanden waren.

Vorsichtsmaßnahmen

  • Wenn die Ansicht zuletzt mit ALTER VIEW geändert wurde, ist das Skript eine ALTER VIEW-Anweisung und keine CREATE VIEW-Anweisung.

  • Das Skript gibt den Namen wieder, wie er erstellt wurde. Die Aktualisierung erfolgt nur, wenn Sie ALTER VIEW ausführen oder die Ansicht mit CREATE VIEW löschen und neu erstellen. Wenn die Ansicht umbenannt wurde (z. B. über sp_rename) oder der Besitz auf ein anderes Schema übertragen wurde, spiegelt das Skript, das Sie zurückerhalten, die ursprüngliche Anweisung CREATE / ALTER VIEW wider: Es gibt nicht den aktuellen Namen des Objekts wieder.

  • Einige Tools kürzen die Ausgabe. Beispielsweise schneidet das MS-SQL-Befehlszeilentool sqlcmd.exe die Daten mit 255 Zeichen ab. Sie können den Parameter übergeben -y N, um das Ergebnis mit NZeichen zu erhalten.

Nicholas Carey
quelle
7
SQL-Abfrage aus der Antwort kann ein wenig vereinfacht werden:select m.definition from sys.sql_modules m where m.object_id = object_id('dbo.MyView', 'V')
Ivan
8
Eine weitere Einschränkung ist, dass Sie wahrscheinlich die richtigen Berechtigungen benötigen, um die Definition anzeigen zu können. Ich bekomme NULL für sie.
Erreichen Sie
1
@schlamar, wenn Sie nur die ersten 255 Zeichen sehen, konvertieren Sie die Ergebnisspalte falsch. Das Schema für sys.sql_modulesdefiniert die Spalte folgendermaßen:definition nvarchar(max) SQL text that defines this module. NULL = Encrypted.
Nicholas Carey
1
@schlamar, Sie können auch feststellen, dass bei Verwendung von SSMS / Query Analyzer, wenn Sie Abfrageergebnisse als Text (und nicht als Raster) ausführen , [n][var]charDaten standardmäßig mit 256 Zeichen abgeschnitten werden. Sie können dies über das Menü unter Query..Query Options...& mdash; Führen Sie im folgenden modalen Dialog einen Drilldown zum Results>TextKnoten in der Baumsteuerung auf der linken Seite durch.
Nicholas Carey
1
Ich verwende das MS-SQL-Befehlszeilentool (sqlcmd.exe). Auch die Daten werden abgeschnitten. Ich musste den Parameter -y N übergeben, um mehr Daten zu erhalten (wirklich MS?). Also danke, dass du mich in die richtige Richtung gelenkt hast.
Schlamar
23

Microsoft hat die folgenden Methoden zum Abrufen der View-Definition aufgelistet: 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';
DaveAlger
quelle
12

Für Benutzer von SQL 2000 lautet der eigentliche Befehl, der diese Informationen bereitstellt:

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
quelle
Diese Version gibt die Ansicht zurück, die in mehrere Datensätze mit jeweils 4.000 Zeichen unterteilt ist. (Getestet in SQL Server 2014.)
Ben
6
SELECT object_definition (OBJECT_ID(N'dbo.vEmployee'))
STiAT
quelle
3

Sie können Tabellen- / Ansichtsdetails über die folgende Abfrage abrufen.

Für Tabelle: sp_help Tabellenname Für Ansicht: sp_help Ansichtsname

vkstream
quelle
0
SELECT definition, uses_ansi_nulls, uses_quoted_identifier, is_schema_bound  
FROM sys.sql_modules  
WHERE object_id = OBJECT_ID('your View Name');  
Bosco Han
quelle