SQL Server 2008作业执行UPDATE时QUOTED_IDENTIFIER错误求助
解决SQL Server作业中UPDATE触发QUOTED_IDENTIFIER错误的问题
我来帮你排查这个头疼的问题——手动执行正常但作业跑失败,大概率是会话级SET选项的上下文差异导致的,毕竟SSMS的默认连接设置和SQL Server Agent作业的默认设置经常不一样。
核心原因分析
你手动在SSMS执行时,SSMS默认会把QUOTED_IDENTIFIER设为ON(不管数据库级的设置是啥),所以操作能正常完成;但作业执行时,默认继承了数据库的False设置,而你的目标表(或者关联的表)大概率存在索引视图、计算列索引、筛选索引这类依赖QUOTED_IDENTIFIER ON的对象,所以修改数据时触发了错误。
一步步解决
1. 先检查作业步骤的默认设置(最容易忽略的点)
SQL Server Agent作业步骤的高级设置会优先于你脚本里的SET语句生效!别只在脚本里加SET QUOTED_IDENTIFIER ON,还要确认步骤本身的配置:
- 打开作业的步骤编辑窗口,切换到「高级」选项卡
- 找到「SET QUOTED_IDENTIFIER」选项,直接勾选「ON」
- 保存作业,重新执行试试
2. 确保脚本中的SET语句位置正确
如果步骤设置没问题,那要保证你的SET语句和UPDATE在同一个批次里,不要用GO分隔(GO会重置会话设置)。正确的脚本应该是:
SET QUOTED_IDENTIFIER ON; UPDATE Table1 SET Column1 = 'C' WHERE col_status = 'A' AND emp_number IN (SELECT emp_number FROM Table2 WHERE emp_status = 'T');
如果你的脚本必须包含GO(比如前面有其他初始化操作),那要在UPDATE所在的批次前重新设置一次QUOTED_IDENTIFIER ON。
3. 验证目标表的依赖对象
如果上面两步都没用,那得确认Table1或Table2是否存在以下对象:
- 计算列上的索引
- 筛选索引
- 索引视图
- 基于这些表的查询通知
这些对象在创建时要求QUOTED_IDENTIFIER ON,后续修改表数据时也必须保持这个设置为ON,否则就会报错。你可以用下面的查询检查Table1的相关依赖:
SELECT o.name AS object_name, o.type_desc FROM sys.objects o JOIN sys.indexes i ON o.object_id = i.object_id WHERE (i.is_computed_column = 1 OR i.is_filtered = 1) AND o.object_id = OBJECT_ID('Table1');
为什么加了SET语句还没用?
大概率是作业步骤的高级设置里把QUOTED_IDENTIFIER设为了OFF,Agent会在执行你的脚本之前先运行SET QUOTED_IDENTIFIER OFF;,所以你脚本里的设置被覆盖了——先改步骤设置再试!
内容的提问来源于stack exchange,提问作者Steve Salowitz
相关产品推荐
相关产品推荐

