【问题标题】:How can I list all foreign keys in a Table?如何列出表中的所有外键?
【发布时间】:2018-05-16 09:27:37
【问题描述】:

假设,我知道数据库Database1 中表TableName1 的名称。

我要找:

  1. 该表具有的外键。
  2. 他们引用了哪些外部表。
  3. 他们引用了哪些外部列。
  4. 这些外来列的类型、大小等。

是否有任何可用的 sql server 查询(不是存储过程)?

注意:

答案是“How can I list all foreign keys referencing a given table in SQL Server?”不符合我的要求,因为他们接受的答案是一个存储过程,其余的没有返回或返回更少的结果。

例如,DailySale 表有两个外键,

但是这个查询

EXEC sp_fkeys 'TableName'

只列出一个。

【问题讨论】:

标签: sql sql-server sql-server-2012


【解决方案1】:

下面的代码 sn-p 可以根据您的进一步要求进行一些使用和修改 - 这将提取列级详细信息,例如data typelengthprecisionscale 等...

SELECT  obj.name AS FK_NAME,
    sch.name AS [schema_name],
    tab1.name AS [table],
    col1.name AS [column],
    tab2.name AS [referenced_table],
    col2.name AS [referenced_column],
    TY.[name] AS system_data_type, col1.[max_length],col1.[precision], col1.[scale], col1.[is_nullable], col1.[is_ansi_padded]
FROM sys.foreign_key_columns fkc
INNER JOIN sys.objects obj
    ON obj.object_id = fkc.constraint_object_id
INNER JOIN sys.tables tab1
    ON tab1.object_id = fkc.parent_object_id
INNER JOIN sys.schemas sch
    ON tab1.schema_id = sch.schema_id
INNER JOIN sys.columns col1
    ON col1.column_id = parent_column_id AND col1.object_id = tab1.object_id
INNER JOIN sys.tables tab2
    ON tab2.object_id = fkc.referenced_object_id
INNER JOIN sys.columns col2
    ON col2.column_id = referenced_column_id AND col2.object_id = tab2.object_id
INNER JOIN sys.[types] TY ON col1.[system_type_id] = TY.[system_type_id] AND col1.[user_type_id] = TY.[user_type_id] 
AND tab1.name = 'TableName1'

【讨论】:

    【解决方案2】:

    您可以将OBJECT_NAME(f.referenced_object_id) = 'tblpatientmaster'OBJECT_NAME(f.parent_object_id) = 'tblpatientmaster' 切换以获取此表的引用以引用此表。

    --Reference in this table
         SELECT
            f.name constraint_name
           ,OBJECT_NAME(f.parent_object_id) referencing_table_name
           ,COL_NAME(fc.parent_object_id, fc.parent_column_id) referencing_column_name
           ,OBJECT_NAME (f.referenced_object_id) referenced_table_name
           ,COL_NAME(fc.referenced_object_id, fc.referenced_column_id) referenced_column_name
    
           , DATA_TYPE column_data_type
        FROM sys.foreign_keys AS f
        INNER JOIN sys.foreign_key_columns AS fc
           ON f.object_id = fc.constraint_object_id
        INNER JOIN INFORMATION_SCHEMA.COLUMNS col 
           ON COL_NAME(fc.parent_object_id, fc.parent_column_id) = col.COLUMN_NAME 
        where OBJECT_NAME(f.referenced_object_id) = 'YouTableName'
        ORDER BY f.name
    

    -- 将此表引用到其他表

    SELECT distinct
        f.name constraint_name
       ,OBJECT_NAME(f.parent_object_id) referencing_table_name
       ,COL_NAME(fc.parent_object_id, fc.parent_column_id) referencing_column_name
       ,OBJECT_NAME (f.referenced_object_id) referenced_table_name
       ,COL_NAME(fc.referenced_object_id, fc.referenced_column_id) referenced_column_name
    
       , DATA_TYPE column_data_type
    FROM sys.foreign_keys AS f
    INNER JOIN sys.foreign_key_columns AS fc
       ON f.object_id = fc.constraint_object_id
    INNER JOIN INFORMATION_SCHEMA.COLUMNS col 
       ON COL_NAME(fc.parent_object_id, fc.parent_column_id) = col.COLUMN_NAME 
    where OBJECT_NAME(f.parent_object_id) = 'YouTableName'
    ORDER BY f.name
    

    【讨论】:

      猜你喜欢
      • 2010-10-03
      • 1970-01-01
      • 2010-09-17
      • 2011-07-11
      • 2010-11-12
      • 1970-01-01
      相关资源
      最近更新 更多