如何用非存储过程的SQL Server查询列出指定表的所有外键及关联信息?
纯SQL Server查询获取外键及关联列属性
当然可以用非存储过程的纯SQL语句实现!我之前也碰到过sp_fkeys返回结果不全的坑,下面这个查询直接读取SQL Server的系统目录视图,能精准返回你需要的所有信息:
SELECT -- 1. 当前表的外键名称 fk.name AS ForeignKeyName, -- 2. 外键引用的外部表名称 referenced_table.name AS ReferencedTableName, -- 3. 外键引用的外部列名称 referenced_column.name AS ReferencedColumnName, -- 4. 外部列的属性:类型、长度/精度、小数位数 type.name AS ColumnDataType, CASE WHEN type.name IN ('char', 'varchar', 'nchar', 'nvarchar') THEN referenced_column.max_length WHEN type.name IN ('decimal', 'numeric') THEN referenced_column.precision ELSE NULL END AS ColumnSizeOrPrecision, CASE WHEN type.name IN ('decimal', 'numeric') THEN referenced_column.scale ELSE NULL END AS ColumnScale FROM sys.foreign_keys fk INNER JOIN sys.foreign_key_columns fkc ON fk.object_id = fkc.constraint_object_id INNER JOIN sys.tables referenced_table ON fkc.referenced_object_id = referenced_table.object_id INNER JOIN sys.columns referenced_column ON fkc.referenced_object_id = referenced_column.object_id AND fkc.referenced_column_id = referenced_column.column_id INNER JOIN sys.types type ON referenced_column.system_type_id = type.system_type_id WHERE -- 替换为你要查询的目标表(支持跨数据库,格式:数据库名.架构名.表名) fk.parent_object_id = OBJECT_ID('Database1.dbo.TableName1');
额外说明:
- 记得把
Database1.dbo.TableName1替换成你实际的表名,如果表在当前默认数据库,也可以简化为TableName1,但带上数据库和架构名能避免歧义 - 这个查询不会出现
sp_fkeys漏列的问题,因为它直接从系统核心视图取数,没有存储过程额外的过滤逻辑 - 如果需要同时显示当前表的外键列名称,可以在SELECT里添加
parent_column.name AS ForeignKeyColumnName,并在JOIN部分追加:INNER JOIN sys.columns parent_column ON fkc.parent_object_id = parent_column.object_id AND fkc.parent_column_id = parent_column.column_id
内容的提问来源于stack exchange,提问作者user366312
相关产品推荐
相关产品推荐

