Sql 从主键获取外键ID

Sql 从主键获取外键ID,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个问题,我不确定我的想法是否走得太远,但问题是我想查询sql server,为指定的主键提供外键ID、列名和表。 下面的查询提供了主键/外键约束、表等 SELECT FK = OBJECT_NAME(fkc.constraint_object_id), Referencing_table = QUOTENAME(OBJECT_SCHEMA_NAME(fkc.parent_object_id)) + '.' + QUOTENAME(OBJECT

我有一个问题,我不确定我的想法是否走得太远,但问题是我想查询sql server,为指定的主键提供外键ID、列名和表。 下面的查询提供了主键/外键约束、表等

   SELECT 
    FK = OBJECT_NAME(fkc.constraint_object_id),
    Referencing_table = QUOTENAME(OBJECT_SCHEMA_NAME(fkc.parent_object_id))
            + '.' + QUOTENAME(OBJECT_NAME(fkc.parent_object_id)),
    Referencing_col = QUOTENAME(pc.name),
    Referenced_table = QUOTENAME(OBJECT_SCHEMA_NAME(fkc.referenced_object_id)) 
            + '.' + QUOTENAME(OBJECT_NAME(fkc.referenced_object_id)),
    Referenced_col = QUOTENAME(rc.name),
    PK = pk.name
FROM sys.foreign_key_columns AS fkc
INNER JOIN sys.columns AS pc
ON fkc.parent_object_id = pc.[object_id]
AND fkc.parent_column_id = pc.column_id
INNER JOIN sys.columns AS rc
ON fkc.referenced_column_id = rc.column_id
AND fkc.referenced_object_id = rc.[object_id]
INNER JOIN (SELECT i.name, fk.[object_id]
  FROM sys.indexes AS i
  INNER JOIN sys.foreign_keys AS fk
  ON i.[object_id] = fk.referenced_object_id
  AND i.index_id = fk.key_index_id
) AS pk
ON pk.[object_id] = fkc.constraint_object_id
ORDER BY Referencing_table, FK, fkc.constraint_column_id;
一个简单的表结构是

create table test.ForeignTable1
(
  foreign_key_table_primary_key1 int primary key identity(1,1),
  randomdata1 varchar(200) not null
)

create table test.ForeignTable2
(
  foreign_key_table_primary_key2 int primary key identity(1,1),
  randomdata2 varchar(200) not null
)

create table test.PrimTable
(
   primary_key_column int primary key identity(1,1),
   ForeignTable1_data int foreign key references test.ForeignTable1(foreign_key_table_primary_key1) ,
   ForeignTable2_data int foreign key references test.ForeignTable2(foreign_key_table_primary_key2) 
)
sql语句的理想输出是返回,对于PrimTable中的特定主键,它将返回test.ForeignTable2test.ForeignTable1中的所有关联ID,并显示它们来自哪个表

如果我提供1,那么它将返回ID(3,7,12)用于测试。ForeignTable1和(6,4458,88)用于测试。ForeignTable2


有没有可能问这样的问题?此外,我还想知道sql server如何在删除过程中确定另一个表中存在外键约束,从而阻止您删除项?

只需运行以下命令:

EXEC sp_fkeys @pktable_name = '<your_PK_table_name>'
EXEC sp_fkeys@pktable_name=''

只需运行以下命令:

EXEC sp_fkeys @pktable_name = '<your_PK_table_name>'
EXEC sp_fkeys@pktable_name=''


没有更易于使用的信息\u schema表?当然可以像您已经做的那样进行查询:-)SQL Server将约束元数据存储在数据库中,并使用该元数据在执行时强制执行引用完整性。元数据通过查询使用的目录视图、
INFORMATIION\u SCHEMA
视图和目录存储过程公开。哦,您希望从相关表中获取实际值。这将是动态SQL的工作。一旦有了表名和列名,您就需要组合一个
select
语句来检索数据,然后使用来运行查询。您打算如何处理由多个列组成的键?输出所有列?输出一条消息,恭敬地拒绝配合?我正在寻找一种从数据库获取信息的动态方法,以了解为什么我不能删除sql中的列,并给出哪些表中的值阻止删除。没有更易于使用的信息\u schema表?当然可以像您已经做的那样进行查询:-)sql Server存储数据库中的约束元数据,并使用该元数据在执行时强制执行引用完整性。元数据通过查询使用的目录视图、
INFORMATIION\u SCHEMA
视图和目录存储过程公开。哦,您希望从相关表中获取实际值。这将是动态SQL的工作。一旦有了表名和列名,您就需要组合一个
select
语句来检索数据,然后使用来运行查询。您打算如何处理由多个列组成的键?输出所有列?输出一条消息,恭敬地拒绝配合?我正在寻找一种从数据库获取信息的动态方法,了解为什么我不能删除sql中的列,并给出哪些表中的值阻止删除。它只是返回一个空行集,是否有我可能缺少的内容?刚刚检查过,调用EXEC sp_fkeys@pktable_name='Table name',@pktable_owner='owner',@pktable_qualifier='qualifier'后,它返回数据,但不返回外键表的ID orry,我没有仔细阅读,只回答了问题的第一部分。您应该迭代该sp(或您自己的查询)的结果,并构建一个动态查询来获取ID。您还应该考虑多字段FKs,如前所述。它只是返回一个空行集,是否有我可能缺少的内容?刚刚检查,在调用EXEC sp_fkeys@pktable_name='Table name',@pktable_owner='owner',@pktable_qualifier='qualifier'后,它返回数据,但是没有返回外键表的ID对不起,我没有仔细阅读,只回答了问题的第一部分。您应该迭代该sp(或您自己的查询)的结果,并构建一个动态查询来获取ID。您还应该考虑多字段FKs,正如前面所述。感谢您的深入回答,我认为我问这个问题可能不好,我将对其进行一些更新,以显示预期输出的示例。谢谢你的回答,我想我问这个问题可能不太好,我会更新一下,以展示一个预期输出的示例。谢谢