1

在 SQL Server 中,我们是否有 build-it 函数来获取两个表之间的外键?

例如Table_A, Table_B

select myfunction ('Table_A', 'Table_B')
-- it should give the column name of its foreign keys, if no any relationship, it return null.

谢谢

4

3 回答 3

3

你可以使用这样的东西:

SELECT 
    FKName = fk.name,
    ParentTable = tpar.name,
    ParentColumn = colpar.name,
    ReferencedTable = tref.name,
    ReferencedColumn = colref.name
FROM
    sys.foreign_keys fk
INNER JOIN 
    sys.foreign_key_columns fkc ON fkc.constraint_object_id = fk.object_id
INNER JOIN 
    sys.tables tpar ON fk.parent_object_id = tpar.object_id
INNER JOIN 
    sys.columns colpar ON fkc.parent_object_id = colpar.object_id AND fkc.parent_column_id = colpar.column_id
INNER JOIN 
    sys.tables tref ON fk.referenced_object_id = tref.object_id
INNER JOIN 
    sys.columns colref ON fkc.referenced_object_id = colref.object_id AND fkc.referenced_column_id = colref.column_id

但是当然,你可以在and之间有多个外键,它们可以“双向”——你可以在 FK 上从to和另一个从to 。TableATableBParentTable = TableAReferencedTable = TableBParentTable = TableBReferencedTable = TableA

因此,要查找两个表之间的所有外键,请使用以下内容:

WHERE
    (ParentTable = 'TableA' AND ReferencedTable = 'TableB') OR
    (ParentTable = 'TableB' AND ReferencedTable = 'TableA')

是的,如果你愿意——你可以把它包装在一个函数中,如果你愿意的话——但是我不建议这样做。

于 2012-06-20T14:23:30.660 回答
3
SELECT TABLE_NAME
   , CONSTRAINT_NAME
   , COLUMN_NAME
   , ORDINAL_POSITION
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE CONSTRAINT_NAME IN (
   SELECT CONSTRAINT_NAME
   FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS)
ORDER BY TABLE_NAME, ORDINAL_POSITION;

看看这里

于 2012-06-20T14:07:13.747 回答
1

有几种方法可以做到这一点。您可以使用以下内容:

  1. 在 SQL Server Management Studio 中创建图表以查看连接/外键(但不是函数)

  2. 您可以使用INFORMATION_SCHEMA. 这允许您查看从系统数据库中提取的所有元数据。这是一个有用教程的链接:INFORMATION_SCHEMA 教程

此外,下面的 StackExchange 文章也解决了类似的问题。这是一个链接: 链接到类似的 StackOverflow 帖子

于 2012-06-20T14:10:41.863 回答