与others previously类似,今天在我的SQL日志中,我可以看到由于错误1934而导致预定作业无法执行。
ALTER INDEX失败,因为以下SET选项的设置不正确:' QUOTED_IDENTIFIER'
在阅读here,here和here之后,我仍然不确定我的 hack (下方)是否根据其他地方提供的建议引入风险。我缺乏经验是这个问题的主要驱动力。
原始代码是:
DECLARE @Database varchar(255);
DECLARE @Table varchar(255);
DECLARE @cmd nvarchar(500);
DECLARE @fillfactor int = 90;
DECLARE DatabaseCursor CURSOR FOR
SELECT
name
FROM
MASTER.dbo.sysdatabases
WHERE
name IN ('MyDbName')
ORDER BY
name;
OPEN DatabaseCursor;
FETCH NEXT FROM DatabaseCursor INTO @Database;
WHILE (@@FETCH_STATUS = 0)
BEGIN
SET @cmd = 'DECLARE TableCursor CURSOR FOR SELECT ''['' + table_catalog + ''].['' + table_schema + ''].['' +
table_name + '']'' as tableName FROM ' + @Database + '.INFORMATION_SCHEMA.TABLES
WHERE table_type = ''BASE TABLE''';
-- create table cursor
EXEC (@cmd);
OPEN TableCursor;
FETCH NEXT FROM TableCursor INTO @Table;
WHILE (@@FETCH_STATUS = 0)
BEGIN
SET @cmd = 'ALTER INDEX ALL ON ' + @Table + ' REBUILD WITH (FILLFACTOR = ' + CONVERT(varchar(3), @fillfactor) + ')';
EXEC (@cmd);
FETCH NEXT FROM TableCursor INTO @Table;
END
CLOSE TableCursor;
DEALLOCATE TableCursor;
FETCH NEXT FROM DatabaseCursor INTO @Database;
END
CLOSE DatabaseCursor;
DEALLOCATE DatabaseCursor;
USE MyDbName;
GO
EXEC sys.sp_updatestats;
我认为在将索引添加到一个特定表中的XML列之后,这个错误就开始了,但我并不是100%肯定。在其他地方,我们也有使用XPATH的存储过程。我知道其他人也遇到了同样的错误,但是没有手动设置QUOTED_IDENTIFIER的经验,我正在寻找建议以及改进修复的方法。
根据我所阅读的内容,此修订后的代码执行时没有错误:
SET @cmd = 'SET QUOTED_IDENTIFIER ON; ' +
'ALTER INDEX ALL ON ' + @Table + ' REBUILD WITH (FILLFACTOR = ' + CONVERT(varchar(3), @fillfactor) + ')';
我担心的是:
提前感谢您分享您的专业知识。
答案 0 :(得分:3)
TRY / CATCH
块捕获错误,以便您可以记录变量'内容在某处。QUOTED_IDENTIFIER
。但是,它不是100%保证,因为数据访问驱动程序可以覆盖连接设置(不同的驱动程序 - ODBC,OLE DB,Native Client等 - 默认值略有不同)。答案 1 :(得分:2)
请将quoted_identifier选项设置为ON然后再次测试
SET QUOTED_IDENTIFIER ON