使用QUOTED_IDENTIFIER克服' ALTER INDEX失败'错误

时间:2016-10-31 11:45:49

标签: sql-server tsql sql-server-2012

others previously类似,今天在我的SQL日志中,我可以看到由于错误1934而导致预定作业无法执行。

  

ALTER INDEX失败,因为以下SET选项的设置不正确:' QUOTED_IDENTIFIER'

在阅读hereherehere之后,我仍然不确定我的 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) + ')';

我担心的是:

  1. 这种变化是否会带来任何不明显的风险或其他危险(仅仅因为它没有错误地运行并不能解决我的神经!)
  2. 如果没有,有没有办法确定究竟是什么原因造成的(例如,一个parituclar索引或DB列/程序)?
  3. 如果是这样,可以在动态SQL中加以考虑并更优雅地处理吗?
  4. 提前感谢您分享您的专业知识。

2 个答案:

答案 0 :(得分:3)

  1. 不,没有风险。
  2. 使用TRY / CATCH块捕获错误,以便您可以记录变量'内容在某处。
  3. 您可以更改服务器属性中的默认连接设置,以便始终启用QUOTED_IDENTIFIER。但是,它不是100%保证,因为数据访问驱动程序可以覆盖连接设置(不同的驱动程序 - ODBC,OLE DB,Native Client等 - 默认值略有不同)。

答案 1 :(得分:2)

请将quoted_identifier选项设置为ON然后再次测试

SET QUOTED_IDENTIFIER ON