Вопрос по database-schema, sql-server-2008, sql-server – как получить имя схемы таблицы

5

Я использую 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

Как вы получаете имя схемы таблицы?

Спасибо за вашу помощь

Используемые вами представления устарели и предназначены только для обратной совместимости. Одним из способов являетсяmsdn.microsoft.com/en-us/library/bb326599(v=sql.90).aspx Martin Smith

Ваш Ответ

2   ответа
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_id затем используйтеSCHEMA_NAME().

Пользу от использованияQUOTENAME скорее, чем'['+...+']', Это будет правильно двойная кавычка] символы, встроенные в имя, которое использование + ... + отсутствует.
@Remus, +1 за это.
@RemusRusana - я пытаюсь этот кодcreate table #t ( nam varchar(100) ) insert into #t(nam)values('abc[]def') select * from #t Where Quotename(nam) like Quotename('abc[]def') drop table #t и не дает мне никакого результата ....
Я поддерживаю использование идентификаторов, которые не требуют QUOTENAME ...
26

использование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
Спасибо за вашу помощь Tom Schreck
Я использовал это, чтобы получить список всех внешних ключей в базе данных. Спасибо!

Похожие вопросы