2012-05-22 5 views
4

J'utilise SQL Server 2008 et ont la requête suivante:comment obtenir le nom de schéma de la table

SELECT SO1.name AS Tab, 
     SC1.name AS Col, 
     SO2.name AS RefTab, 
     SC2.name AS RefCol, 
     FO.name AS FKName 
FROM dbo.sysforeignkeys FK 
INNER JOIN dbo.syscolumns SC1 ON FK.fkeyid = SC1.id AND FK.fkey = SC1.colid 
INNER JOIN dbo.syscolumns SC2 ON FK.rkeyid = SC2.id AND FK.rkey = SC2.colid 
INNER JOIN dbo.sysobjects SO1 ON FK.fkeyid = SO1.id 
INNER JOIN dbo.sysobjects SO2 ON FK.rkeyid = SO2.id 
INNER JOIN dbo.sysobjects FO ON FK.constid = FO.id 

Comment récupérer-vous le nom de schéma de la table?

Merci pour votre aide

+2

Les vues que vous utilisez sont dépréciée et pour la compatibilité ascendante. Une façon est http://msdn.microsoft.com/en-us/library/bb326599(v=sql.90).aspx –

Répondre

21

Utilisez OBJECT_SCHEMA_NAME

SELECT 
    OBJECT_SCHEMA_NAME(f.parent_object_id) AS TableNameSchema, -- this 
    OBJECT_NAME(f.parent_object_id) AS TableName, 
    COL_NAME(fc.parent_object_id,fc.parent_column_id) AS ColumnName, 
    OBJECT_SCHEMA_NAME(f.referenced_object_id) AS ReferenceTableNameSchema, 
    OBJECT_NAME (f.referenced_object_id) AS ReferenceTableName, 
    COL_NAME(fc.referenced_object_id,fc.referenced_column_id) AS ReferenceColumnName, 
    f.name AS ForeignKey 
FROM 
    sys.foreign_keys AS f 
    INNER JOIN sys.foreign_key_columns AS fc ON f.OBJECT_ID = fc.constraint_object_id 
    INNER JOIN sys.objects AS o ON o.OBJECT_ID = fc.referenced_object_id 
+0

Merci pour votre aide –

+0

J'ai utilisé ceci pour obtenir une liste de toutes les clés étrangères dans la base de données. Merci! – Zero3

3

Comme par Sql Server 2008:

SELECT Object_name(f.parent_object_id) 
     AS 
     TableName, 
     Col_name(fc.parent_object_id, fc.parent_column_id) 
     AS ColumnName, 
     Object_name (f.referenced_object_id) 
     AS ReferenceTableName, 
     Col_name(fc.referenced_object_id, fc.referenced_column_id) 
     AS 
     ReferenceColumnName, 
     f.name 
     AS ForeignKey, 
     Quotename(Schema_name(f.schema_id)) + '.' + Quotename( 
     Object_name(f.parent_object_id)) AS 
     schemaname, 
     Quotename(Schema_name(o.schema_id)) + '.' + Quotename( 
     Object_name(f.referenced_object_id)) 
             AS ReferenceSchemaName 
FROM sys.foreign_keys AS f 
     INNER JOIN sys.foreign_key_columns AS fc 
     ON f.OBJECT_ID = fc.constraint_object_id 
     INNER JOIN sys.objects AS o 
     ON o.OBJECT_ID = fc.referenced_object_id 

Si vouloir connaître le nom de schéma sur la base de object_id puis utilisez OBJECT_SCHEMA_NAME(), si vous voulez obtenir le nom de schéma sur la base de schema_id puis utilisez SCHEMA_NAME().

+2

Favoriser l'utilisation de ['QUOTENAME'] (http://msdn.microsoft.com/ en-us/library/ms176114.aspx) au lieu de ''['' + ... + '']' '. Il va correctement doubler les caractères ']' intégrés dans le nom, ce que l'utilisation de + ... + manque. –

+0

@Remus, +1 pour cela. –

+0

@RemusRusana - Je suis en train de ce code 'create table #t valeurs ( \t nam varchar (100) ) insert dans #t (NAM) ('abc [] def') select * from #t Où QUOTENAME (nam) comme Quotename ('abc [] def') drop table # t' et ne pas me donner de résultat .... – Nilish

Questions connexes