场景相当简单:作业在生产中失败,发出错误“ALTER INDEX 失败,因为以下 SET 选项的设置不正确:'QUOTED_IDENTIFIER' ...”。
问题是,为什么这个问题会出现在生产环境中,而不是出现在我们的任何测试环境中?检查 DBCC USEROPTIONS,结果在所有数据库中完全相同。此外,脚本本身根本不包含引号。它只是重建一些索引并使用全扫描更新一些统计信息。
在任何其他数据库上使用完全相同的作业,我可以将 QUOTED_IDENTIFIER 设置为 ON 或 OFF,或者根本不设置它并让它在连接默认值上运行。无论如何,它总是有效的。但在生产中,它似乎必须设置为 ON 或 OFF。
我问这个是因为时间方面我负担不起每天测试一次,我需要知道为什么会发生这个错误以及如何预测需要哪个设置以及何时需要。测试和生产数据库之间唯一明显的区别是排序规则,但即使创建测试数据库以匹配生产中的排序规则,无论 QUOTED_IDENTIFIER 设置如何,作业仍然有效。
谢谢!
我刚刚遇到了同样的问题。默认情况下,作业步骤中的第一条语句是 to
SET QUOTED_IDENTIFIER OFF
- 您可以在 Profiler 跟踪中看到这一点。解决方案是在代码的开头添加一行到SET QUOTED_IDENTIFIER ON
.至于您的脚本不包含引号 - 我相信在创建或重建某些类型的索引时,需要进行设置。
这里有几个链接:
https://stackoverflow.com/questions/15218893/first-statement-issued-by-sql-server-agent-sets-quoted-identifier-off
我发现 SQL 代理作业根据数据库的兼容性级别设置数据库选项,这可以覆盖已设置的数据库选项。
即,数据库具有 SET QUOTED_IDENTIFIER ON 的数据库选项,但是数据库的兼容性级别设置为 SQL 2000,因此 SQL 作业失败(即,当尝试更新已过滤索引的表中的行时)。
将兼容级别切换到 SQL 2008,然后 SQL 作业将成功。
我在安排创建索引的作业时遇到了同样的问题。我所做的是
1) - 我运行这个脚本来确定选项的当前值是什么
2)我修改了我的创建索引作业,根据需要添加了 QUOTED_IDENTIFIER 的设置。您可以在下面的工作创建代码中看到这一点。这目前正在工作。