2012-05-22 68 views
4

我使用的是SQL Server 2008和有以下查询:如何获取表的架构名称

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 

你如何检索表的模式的名字吗?

感谢您的帮助

+2

您正在使用已过时,仅用于向后兼容性的意见。一种方法是http://msdn.microsoft.com/en-us/library/bb326599(v=sql.90).aspx –

回答

21

使用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

感谢您的帮助 –

+0

我用这个来获取数据库中所有外键的列表。谢谢! – Zero3

3

按照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 

如果想知道的object_id基础架构名称,然后使用OBJECT_SCHEMA_NAME(),如果你想上的基础上获取架构名然后使用SCHEMA_NAME()

+2

青睐使用['QUOTENAME'](http://msdn.microsoft.com/ en-us/library/ms176114.aspx)而不是'[''+ ... +'']''。它会正确地将名称中嵌入的'''字符加倍,使用+ ... +错过。 –

+0

@Remus,为此+1。 –

+0

@RemusRusana - 我想这个代码'创建表#T ( \t南VARCHAR(100) ) 插入到#T(NAM)VALUES( 'ABC []高清') SELECT * FROM #T如果QUOTENAME (nam)像Quotename('abc [] def') drop table#t'并且不给我任何结果.... – Nilish