You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure SQL Database中获取主键名称的方法及INFORMATION_SCHEMA兼容性疑问

关于Azure SQL Database中获取主键列名的方案与兼容性问题

嘿,这个问题挺有代表性的,我来给你梳理清楚~

现状:你的INFORMATION_SCHEMA查询为啥能正常运行?

虽然微软官方明确说明Azure SQL Database不保证INFORMATION_SCHEMA视图的长期兼容性,但目前这些视图还能正常工作——原因是它们从SQL Server继承而来,Azure SQL DB为了向后兼容暂时保留了这部分内容。不过这只是“过渡性支持”,未来微软完全可能调整甚至移除部分INFORMATION_SCHEMA的功能,所以把它作为长期依赖的方案风险很高。

推荐的官方替代方案

微软官方推荐使用sys目录视图来查询元数据,这是Azure SQL Database完全支持且长期稳定的方案。针对你的需求,对应的查询可以写成这样:

DECLARE @Item NVARCHAR(128) = 'YourTableName'; -- 替换成你的目标表名

SELECT c.name AS PrimaryKeyName
FROM sys.tables t
JOIN sys.indexes i ON t.object_id = i.object_id
JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id
JOIN sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id
WHERE t.name = @Item
AND i.is_primary_key = 1;

这个方案的优势很明显:

  • 完全符合Azure SQL Database的官方规范,长期兼容性有保障
  • 性能优于INFORMATION_SCHEMA视图,因为目录视图是更底层的元数据存储
  • 能获取更多扩展信息(比如索引ID、列顺序等),后续有需求时更容易扩展

如果你的表包含自定义Schema(比如dbo.YourTable),可以调整查询加上Schema过滤:

DECLARE @SchemaName NVARCHAR(128) = 'dbo';
DECLARE @Item NVARCHAR(128) = 'YourTableName';

SELECT c.name AS PrimaryKeyName
FROM sys.schemas s
JOIN sys.tables t ON s.schema_id = t.schema_id
JOIN sys.indexes i ON t.object_id = i.object_id
JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id
JOIN sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id
WHERE s.name = @SchemaName
AND t.name = @Item
AND i.is_primary_key = 1;

兼容性对比

方案类型Azure SQL DB支持状态长期稳定性适用场景
INFORMATION_SCHEMA临时兼容(非官方支持)低临时脚本、快速测试场景
sys目录视图官方完全支持高生产环境、长期维护的应用脚本

内容的提问来源于stack exchange,提问作者Philip

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:44:00