禁用 SQL Server 中表上的所有索引而不显示警告消息

0 sql-server t-sql

有时候我们需要对某些表进行批量更新,而帮助数据库在正常使用中顺利运行的索引就成为了一个障碍。因此,我们禁用该表上的所有索引,执行更新,然后重新启用它们。要禁用表“x”上的所有索引,我们运行 t-sql 语句:

ALTER INDEX ALL ON x DISABLE
Run Code Online (Sandbox Code Playgroud)

这会导致一大堆警告,例如:

警告:由于禁用表上的聚集索引,表“x”上的索引“y”被禁用。

这很公平,但我们知道我们在做什么,所以这些警告只是噪音。

是否可以添加类似于 DBCC 命令上的 NO_INFOMSGS 参数的内容来抑制这些不需要的警告?

Cha*_*ace 6

不,您无法禁用此警告。

但如果您愿意,您可以构建一个动态 SQL 字符串,按顺序禁用索引,最后是聚集索引。

DECLARE @sql nvarchar(max);
SELECT @sql = STRING_AGG(
  'ALTER INDEX ' + i.name + ' ON t DISABLE;',
  '
' ) WITHIN GROUP (ORDER BY i.index_id DESC)
FROM sys.indexes i
JOIN sys.tables t ON t.object_id = i.object_id
JOIN sys.schemas s ON s.schema_id = t.schema_id
WHERE t.name = 't'
  AND s.name = 'dbo';

PRINT @sql;

EXEC sp_executesql @sql
Run Code Online (Sandbox Code Playgroud)

数据库<>小提琴

这显然要复杂得多,而且可能不值得。