You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:25:55