如何编写支持按需启用ONLINE=ON的跨环境非聚集索引创建语句
解决方案:跨环境兼容的动态索引创建语句
当然可以实现这种跨环境兼容的索引创建逻辑!核心思路是通过动态SQL结合对SQL Server实例版本/版本级别的判断,自动决定是否添加ONLINE = ON参数。
具体实现代码
下面的脚本会自动检测当前环境是否支持在线索引操作,然后生成对应的创建语句:
DECLARE @createIndexSql NVARCHAR(MAX); DECLARE @onlineClause NVARCHAR(50) = N''; -- 判断当前实例是否支持ONLINE索引参数 IF (SERVERPROPERTY('EngineEdition') IN (3, 8)) -- 3 = Enterprise/Developer版; 8 = Azure SQL Database(所有层级) BEGIN SET @onlineClause = N'WITH (ONLINE = ON)'; END -- 拼接完整的索引创建语句 SET @createIndexSql = N'CREATE NONCLUSTERED INDEX [IX_MyIndex] ON [Customers].[Activities] ([CustomerId]) INCLUDE ([AccessBitmask], [ActivityCode], [DetailsJson], [OrderId], [OperationGuid], [PropertiesJson], [TimeStamp]) ' + @onlineClause; -- 执行动态SQL EXEC sp_executesql @createIndexSql;
关键逻辑说明
- 版本判断依据:
SERVERPROPERTY('EngineEdition')返回的数值对应不同的SQL Server版本级别:3:对应Enterprise版、Developer版(这两个版本支持在线索引操作)8:对应Azure SQL Database(不管是单数据库、弹性池还是托管实例,都支持在线索引)2:对应Express/LocalDB版(不支持在线索引,此时@onlineClause为空,生成的语句会自动省略WITH (ONLINE = ON))
扩展说明(可选)
如果你的环境包含SQL Server 2019及以后的Standard版,这个版本开始支持非聚集索引的在线创建,可以调整判断逻辑来覆盖这种场景:
IF (SERVERPROPERTY('EngineEdition') IN (3, 8) OR (SERVERPROPERTY('EngineEdition') = 4 AND SERVERPROPERTY('ProductMajorVersion') >= 15)) -- 4 = Standard版; 15对应SQL Server 2019 BEGIN SET @onlineClause = N'WITH (ONLINE = ON)'; END
注意事项
- 执行该脚本需要具备
CREATE INDEX权限,以及执行sp_executesql的权限 - 动态SQL不会影响索引创建的最终效果,只是根据环境自动适配参数
内容的提问来源于stack exchange,提问作者Mark Heath
相关产品推荐
相关产品推荐

