如何列出表中的所有外键?

时间:2018-05-16 09:27:37

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

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

我想找到:

  1. 表中的外键。
  2. 他们引用的外国表格。
  3. 他们引用的是哪些外国专栏。
  4. 这些外国专栏的类型,大小等。
  5. 是否有可用的SQL服务器查询(非存储过程)?

    注意:

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

    例如,DailySale表有两个外键,

    enter image description here

    但是这个查询

    EXEC sp_fkeys 'TableName'
    

    只列出一个。

    enter image description here

2 个答案:

答案 0 :(得分:1)

以下代码段可以用于某些用途,并根据您的进一步要求进行修改 - 这会提取列级详细信息,例如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'

答案 1 :(得分:0)

您可以使用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

- 将此表格引用到其他表格

double avg(int* grade, int len){
    int i; int sum=0;

    for(i=0;i<len;i++){
        sum+=grade[i];
    }

    return (sum * 10 / len) / 10.0;
}