Azure SQL中SSMS生成表CREATE脚本不显示新建索引的问题
具体原因
这个问题和索引创建是否成功无关,本质是SSMS生成表脚本的默认规则限制,结合你使用系统版本控制时态表的场景,对应原因如下:
- 你创建的非聚集索引本身是正常生效的——能在索引列表查到索引、创建后数据库性能提升这两点,已经可以确认索引没有创建失败、不存在元数据异常。
- SSMS的「Script Table as Create To」功能默认配置下,不会为表的非聚集索引生成脚本,默认只会导出表结构、主键约束、系统版本控制关联关系这类核心对象,普通非聚集索引属于默认被排除的脚本内容。
- 如果你执行Azure索引建议时,索引是建在时态表关联的历史表上,那主表的创建脚本本身就不会包含历史表的附属对象:历史表是和主表关联的独立表,SSMS默认不会把历史表的索引、约束这类对象合并到主表的创建脚本里。
解决步骤
- 先确认索引的实际归属,执行如下SQL,替换成你自己的索引名即可:
SELECT t.name AS 所属表名, t.temporal_type_desc AS 表时态类型, i.name AS 索引名, i.type_desc AS 索引类型 FROM sys.indexes i INNER JOIN sys.tables t ON i.object_id = t.object_id WHERE i.name = N'你新建的非聚集索引名称' - 修改SSMS的脚本生成默认规则:
- 打开SSMS顶部菜单栏的「工具」-「选项」
- 依次展开「SQL Server 对象资源管理器」-「脚本」节点
- 在右侧配置列表里找到「编写索引脚本」,把值修改为
True - 如果你要导出的索引在历史表上,再找到「编写时态表脚本」分类下的「包含历史表对象」选项,设置为
True
- 配置保存后,重新使用「Script Table as Create To」生成脚本,就能看到你之前创建的非聚集索引了。
注意:不要反复执行索引创建语句,索引已经正常存在并生效,重复创建会触发报错。
内容的提问来源于stack exchange,提问作者Kenny_I
相关产品推荐
相关产品推荐

