web-dev-qa-db-fra.com

Existe-t-il un moyen de récupérer la définition de la vue à partir d'un serveur SQL en utilisant ADO brut?

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

La principale interaction avec les tables ci-dessus a lieu à l'aide de plusieurs vues. Alors que OpenSchema() peut 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 un élément crucial d'information - la table et la colonne dans les tables sous-jacentes auxquelles 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, de manière à indiquer "ColumnX mappé sur ColumnY dans la table Z" ou sous la forme de la commande SQL utilisée pour créer la vue?

71
Timo Geusch

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 retourne une seule ligne contenant le script utilisé pour créer/modifier la vue.

Les autres colonnes du tableau donnent des informations sur les options en place au moment où la vue a été compilée.

Mises en garde

  • Si la vue a été modifiée avec ALTER VIEW pour la dernière fois, 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éé. Si vous exécutez ALTER VIEW ou si vous supprimez et recréez la vue avec CREATE VIEW, vous ne pourrez le mettre à jour que si vous le mettez à jour. Si la vue a été renommée (par exemple, via sp_rename) ou si la propriété a été transférée à un schéma différent, le script que vous récupérez reflétera l'instruction CREATE/ALTER VIEW d'origine: elle 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 N pour obtenir le résultat avec N.

130
Nicholas Carey

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';
18
DaveAlger

Pour les utilisateurs de SQL 2000, la commande qui fournira ces informations est la suivante:

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
TravelinGuy
SELECT object_definition (OBJECT_ID(N'dbo.vEmployee'))
5
user1967725

Vous pouvez obtenir des détails de table/vue à travers la requête ci-dessous.

Pour table: sp_help nom_table Pour View: sp_help nom_vue

0
vkstream