Existe-t-il un moyen de récupérer la définition de vue à partir d'un serveur SQL Server à l'aide d'ADO ordinaire?

89

J'extrais avec succès des définitions de colonnes à partir de bases de données hébergées sur un serveur SQL à l'aide de l' OpenSchema()appel ADO Connection dans ses différentes incarnations afin de pouvoir recréer ces tables par programme dans une autre base de données SQL. Jusqu'ici tout va bien.

L'interaction principale avec les tableaux ci-dessus se produit en utilisant plusieurs vues; alors qu'il OpenSchema()est capable de renvoyer les définitions de colonne pour la vue de la même manière qu'il renvoie les définitions de colonne pour une table, il manque une information cruciale - à quelle table et colonne dans les tables sous-jacentes la colonne de la vue correspond.

J'ai essayé d'accéder à la commande SQL utilisée pour créer la vue à l'aide des vues de catalogue ADOX, mais il semble que le pilote OLEDB pour SQL Server que nous utilisons ne prend pas en charge cette fonctionnalité.

Existe-t-il un moyen d'obtenir ces informations pour la configuration de la vue via ADO, soit d'une manière qui indique «ColumnX mappe à ColumnY dans la table Z» ou sous la forme de la commande SQL réelle utilisée pour créer la vue?

Timo Geusch
la source

Réponses:

160

Quelle version de SQL Server?

Pour SQL Server 2005 et versions ultérieures, vous pouvez obtenir le script SQL utilisé pour créer la vue comme suit:

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'

Cela renvoie une seule ligne contenant le script utilisé pour créer / modifier la vue.

D'autres colonnes du tableau décrivent les options en place au moment de la compilation de la vue.

Mises en garde

  • Si la vue a été modifiée pour la dernière fois avec ALTER VIEW, alors le script sera une instruction ALTER VIEW plutôt qu'une instruction CREATE VIEW.

  • Le script reflète le nom tel qu'il a été créé. Le seul moment où il est mis à jour est si vous exécutez ALTER VIEW ou si vous supprimez et recréez la vue avec CREATE VIEW. Si la vue a été renommée (par exemple via sp_rename) ou si la propriété a été transférée vers un schéma différent, le script que vous récupérez reflètera l'instruction CREATE / ALTER VIEW originale: il ne reflétera pas le nom actuel des objets.

  • Certains outils tronquent la sortie. Par exemple, l'outil de ligne de commande MS-SQL sqlcmd.exe tronque les données à 255 caractères. Vous pouvez passer le paramètre -y Npour obtenir le résultat avec des Ncaractères.

Nicolas Carey
la source
8
La requête SQL de la réponse peut être un peu simplifiée:select m.definition from sys.sql_modules m where m.object_id = object_id('dbo.MyView', 'V')
Ivan
9
une autre mise en garde est que vous avez probablement besoin des bonnes autorisations pour pouvoir afficher la définition. Je reçois NULL pour eux.
rveach
1
@schlamar, si vous ne voyez que les 255 premiers caractères, vous ne convertissez pas correctement la colonne de résultat. Le schéma de sys.sql_modulesdéfinit la colonne ainsi:definition nvarchar(max) SQL text that defines this module. NULL = Encrypted.
Nicholas Carey
1
@schlamar, vous pouvez également noter que si vous utilisez SSMS / Query Analyzer, si vous exécutez les résultats de la requête sous forme de texte (plutôt que sous forme de grille), par défaut, les [n][var]chardonnées sont tronquées à 256 caractères. Vous pouvez changer cela via le menu de Query..Query Options...& mdash; Dans la boîte de dialogue modale qui s'ensuit, accédez au Results>Textnœud dans le contrôle d'arborescence sur le côté gauche.
Nicholas Carey
1
J'utilise l'outil de ligne de commande MS-SQL (sqlcmd.exe). Il tronque également les données. J'ai dû passer le paramètre -y N pour obtenir plus de données (vraiment MS?). Alors merci de m'avoir pointé dans la bonne direction.
schlamar
24

Microsoft a répertorié les méthodes suivantes pour obtenir la définition d'une vue: 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
la source
12

Pour les utilisateurs de SQL 2000, la commande réelle qui fournira ces informations est:

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
la source
Cette version renvoie la vue divisée en plusieurs enregistrements de 4 000 caractères chacun. (Testé dans SQL Server 2014.)
Ben
7
SELECT object_definition (OBJECT_ID(N'dbo.vEmployee'))
STiAT
la source
3

Vous pouvez obtenir les détails de la table / afficher via la requête ci-dessous.

Pour la table: sp_help nom_table Pour la vue: sp_help nom_vue

vkstream
la source
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
la source