C'è un modo per recuperare la definizione della vista da un SQL Server utilizzando semplice ADO?


89

Sto estraendo con successo le definizioni delle colonne dai database ospitati su un server SQL utilizzando la OpenSchema()chiamata ADO Connection nelle sue varie incarnazioni in modo da poter ricreare a livello di programmazione quelle tabelle in un altro database SQL. Fin qui tutto bene.

L'interazione principale con le tabelle precedenti avviene utilizzando più visualizzazioni; mentre OpenSchema()è in grado di restituire le definizioni di colonna per la vista nello stesso modo in cui restituisce le definizioni di colonna per una tabella, manca un bit cruciale di informazioni - a quale tabella e colonna nelle tabelle sottostanti è mappata la colonna nella vista.

Ho provato ad accedere al comando SQL utilizzato per creare la vista utilizzando ADOX Catalog Views, ma sembra che il driver OLEDB per SQL Server che stiamo utilizzando non supporti questa funzionalità.

Esiste un modo per ottenere queste informazioni per la configurazione della vista tramite ADO, in un modo che indica "ColumnX mappatura a ColumnY nella tabella Z" o nella forma del comando SQL effettivo utilizzato per creare la vista?

Risposte:


160

Quale versione di SQL Server?

Per SQL Server 2005 e versioni successive, è possibile ottenere lo script SQL utilizzato per creare la vista in questo modo:

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'

Restituisce una singola riga contenente lo script utilizzato per creare / modificare la vista.

Altre colonne nella tabella parlano delle opzioni in vigore al momento della compilazione della vista.

Avvertenze

  • Se la vista è stata modificata l'ultima volta con ALTER VIEW, lo script sarà un'istruzione ALTER VIEW piuttosto che un'istruzione CREATE VIEW.

  • Lo script riflette il nome così come è stato creato. L'unica volta che viene aggiornato è se esegui ALTER VIEW, o rilascia e ricrea la vista con CREATE VIEW. Se la vista è stata rinominata (ad es. Tramite sp_rename) o la proprietà è stata trasferita a uno schema diverso, lo script restituito rifletterà l'istruzione CREATE / ALTER VIEW originale: non rifletterà il nome corrente dell'oggetto.

  • Alcuni strumenti troncano l'output. Ad esempio, lo strumento da riga di comando MS-SQL sqlcmd.exe tronca i dati a 255 caratteri. Puoi passare il parametro -y Nper ottenere il risultato con i Ncaratteri.


8
La query SQL dalla risposta può essere semplificata un po ':select m.definition from sys.sql_modules m where m.object_id = object_id('dbo.MyView', 'V')
Ivan

9
un altro avvertimento è che probabilmente hai bisogno delle autorizzazioni corrette per poter visualizzare la definizione. Ricevo NULL per loro.
Raggiungi

1
@schlamar, se tutto ciò che vedi sono i primi 255 caratteri, stai convertendo la colonna dei risultati in modo errato. Lo schema per sys.sql_modulesdefinisce la colonna così:definition nvarchar(max) SQL text that defines this module. NULL = Encrypted.
Nicholas Carey

1
@schlamar, potresti anche notare che se stai usando SSMS / Query Analyzer, se stai eseguendo i risultati della query come testo (piuttosto che una griglia), per impostazione predefinita, i [n][var]chardati vengono troncati a 256 caratteri. Puoi cambiarlo tramite il menu in Query..Query Options...& mdash; Dalla successiva finestra di dialogo modale, eseguire il drill-down al Results>Textnodo nel controllo ad albero sul lato sinistro.
Nicholas Carey

1
Uso lo strumento della riga di comando MS-SQL (sqlcmd.exe). Inoltre tronca i dati. Ho dovuto passare il parametro -y N per ottenere più dati (davvero MS?). Quindi grazie per avermi indicato nella giusta direzione.
schlamar

24

Microsoft ha elencato i seguenti metodi per ottenere la definizione di una vista: 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

Per gli utenti di SQL 2000, il comando effettivo che fornirà queste informazioni è:

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

Questa versione restituisce la vista suddivisa in più record di 4.000 caratteri ciascuno. (Testato in SQL Server 2014.)
Ben

7
SELECT object_definition (OBJECT_ID(N'dbo.vEmployee'))

3

È possibile ottenere la tabella / visualizzare i dettagli tramite la query sottostante.

Per la tabella: sp_help nome_tabella Per la visualizzazione: sp_help nome_vista


0
SELECT definition, uses_ansi_nulls, uses_quoted_identifier, is_schema_bound  
FROM sys.sql_modules  
WHERE object_id = OBJECT_ID('your View Name');  
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.