gpt4 book ai didi

sql - 列出一个表的所有外键,同一个表的多个外键

转载 作者:行者123 更新时间:2023-12-04 20:56:49 25 4
gpt4 key购买 nike

我使用以下 SQL 查询给定表的键(主键和外键)及其描述。我正在使用 SQL Server 2005。

SELECT  c.name 'Column Name' ,
t.name 'Data type' ,
c.max_length 'Max Length' ,
c.precision ,
c.scale ,
c.is_nullable ,
ISNULL(i.is_primary_key, 0) 'Primary Key' ,
CAST (( SELECT COUNT(*)
FROM ( SELECT cx.object_id
FROM sys.foreign_key_columns fkc
INNER JOIN sys.columns cx ON fkc.parent_column_id = cx.column_id
AND fkc.parent_object_id = cx.object_id
INNER JOIN sys.columns cref ON fkc.referenced_column_id = cref.column_id
AND fkc.referenced_object_id = cref.object_id
WHERE cx.column_id = c.column_id
AND fkc.parent_object_id = OBJECT_ID('[dbo].Cards')
) xxx
) AS BIT) AS 'Foreign Key' ,
( SELECT OBJECT_SCHEMA_NAME(fkc.referenced_object_id)
FROM sys.foreign_key_columns fkc
INNER JOIN sys.columns cy ON fkc.parent_column_id = cy.column_id
AND fkc.parent_object_id = cy.object_id
INNER JOIN sys.columns cref ON fkc.referenced_column_id = cref.column_id
AND fkc.referenced_object_id = cref.object_id
WHERE cy.column_id = c.column_id
AND fkc.parent_object_id = OBJECT_ID('[dbo].Cards')
) 'Schema Name' ,
( SELECT OBJECT_NAME(referenced_object_id)
FROM sys.foreign_key_columns fkc
INNER JOIN sys.columns cy ON fkc.parent_column_id = cy.column_id
AND fkc.parent_object_id = cy.object_id
INNER JOIN sys.columns cref ON fkc.referenced_column_id = cref.column_id
AND fkc.referenced_object_id = cref.object_id
WHERE cy.column_id = c.column_id
AND fkc.parent_object_id = OBJECT_ID('[dbo].Cards')
) 'Referenced table' ,
( SELECT cref.name
FROM sys.foreign_key_columns fkc
INNER JOIN sys.columns cy ON fkc.parent_column_id = cy.column_id
AND fkc.parent_object_id = cy.object_id
INNER JOIN sys.columns cref ON fkc.referenced_column_id = cref.column_id
AND fkc.referenced_object_id = cref.object_id
WHERE cy.column_id = c.column_id
AND fkc.parent_object_id = OBJECT_ID('[dbo].Cards')
) 'Referenced column name' ,
( SELECT sep.value [Description]
FROM sys.extended_properties sep
WHERE OBJECT_ID('[dbo].Cards') = sep.major_id
AND c.column_id = sep.minor_id
) Description FROM sys.columns c
INNER JOIN sys.types t ON c.user_type_id = t.user_type_id
LEFT OUTER JOIN sys.index_columns ic ON ic.object_id = c.object_id
AND ic.column_id = c.column_id
LEFT OUTER JOIN sys.indexes i ON ic.object_id = i.object_id
AND ic.index_id = i.index_id WHERE c.object_id = OBJECT_ID('[dbo].Cards');

该查询适用于所有表,除非该表有两个指向同一个表的外键。

我得到的错误是,

"Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression."

我做错了什么?

最佳答案

我没有检查你的第二个查询,但问题仍然存在:返回超过1个值的子查询是这个

( SELECT    sep.value [Description]
FROM sys.extended_properties sep
WHERE OBJECT_ID('person.stateProvince') = sep.major_id
AND c.column_id = sep.minor_id
) Description

您应该在 where 子句中添加附加条件:

and class = 1 -- OBJECT_OR_COLUMN

您的查询不考虑表的超过 1 个索引,加入 c.column_id = sep.minor_id 您可以获得更多行,因为当类为 7(索引)时 minor_id 是索引 ID,而不是列 ID

关于sql - 列出一个表的所有外键,同一个表的多个外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43885110/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com