REBUILD_INDEX SP 中 'Activity' 附近的语法不正确

Incorrect syntax near 'Activity' in REBUILD_INDEX SP

下面是用于 REBUILD_INDEX 数据库表的存储过程,它之前执行得很好,但是当我现在检查时它显示以下错误,

Msg 102, Level 15, State 1, Line 3
Incorrect syntax near 'Activity'.

Msg 319, Level 15, State 1, Line 3
Incorrect syntax near the keyword 'with'. If this statement is a common table expression, an xmlnamespaces clause or a change tracking context clause, the previous statement must be terminated with a semicolon

但是存储过程中没有文本'Activity',也没有使用CTE。无法猜测这个突然问题的原因。谁能给我一些线索?

USE [DBName]
GO

/****** Object:  StoredProcedure [dbo].[REBUILD_INDEX]
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[REBUILD_INDEX]
AS
BEGIN

DECLARE @TableName VARCHAR(255)
DECLARE @sql NVARCHAR(500)
DECLARE @fillfactor INT
SET @fillfactor = 80
DECLARE TableCursor CURSOR FOR
SELECT OBJECT_SCHEMA_NAME([object_id])+'.'+name AS TableName
FROM sys.tables
OPEN TableCursor
FETCH NEXT FROM TableCursor INTO @TableName
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = 'ALTER INDEX ALL ON ' + @TableName + ' REBUILD WITH (FILLFACTOR = ' + CONVERT(VARCHAR(3),@fillfactor) + ')'
EXEC (@sql)
FETCH NEXT FROM TableCursor INTO @TableName
END
CLOSE TableCursor
DEALLOCATE TableCursor

END

您应该添加分号并使用 QUOTENAME:

ALTER PROCEDURE [dbo].[REBUILD_INDEX]
AS
BEGIN

DECLARE @TableName VARCHAR(255);
DECLARE @sql NVARCHAR(500);
DECLARE @fillfactor INT;
SET @fillfactor = 80;
DECLARE TableCursor CURSOR FOR
SELECT OBJECT_SCHEMA_NAME([object_id])+'.'+QUOTENAME(name) AS TableName
FROM sys.tables;
OPEN TableCursor;
FETCH NEXT FROM TableCursor INTO @TableName;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = 'ALTER INDEX ALL ON ' + @TableName 
   + ' REBUILD WITH (FILLFACTOR = ' + CONVERT(VARCHAR(3),@fillfactor) + ');';

PRINT @sql; -- debug only
EXEC (@sql);

FETCH NEXT FROM TableCursor INTO @TableName;
END;
CLOSE TableCursor;
DEALLOCATE TableCursor;

END;

我打赌解析器错误 WITH 常见 Table 表达式 WITH 来自 ALTER INDEX.


反正我会用Ola Hallengren's SQL Server Index and Statistics Maintenance Scripts而不是重新发明轮子。

"Activity" 几乎可以肯定是带有 space 的 Table 名称的一部分。在 ALTER INDEX 语句中的 @TableName 周围添加 Quotename(..)。