去年,我有一个 SQL 代理工作,每晚凌晨 2 点成功运行;我们没有专门对该工作进行任何更改,但它突然给出了错误:
MERGE 失败,因为以下 SET 选项的设置不正确:'QUOTED_IDENTIFIER'。验证 SET 选项是否适用于索引视图和/或计算列上的索引和/或过滤索引和/或查询通知和/或 XML 数据类型方法和/或空间索引操作
我四处阅读,看起来一个快速的解决方法是在这项工作的最顶部插入命令“SET QUOTED_IDENTIFIER ON”。
但是,我真的很想知道为什么会这样?该作业不调用任何存储过程,而是使用某些视图、表进行合并、插入、更新。
我验证了我所有的视图和表格都将quoted_identifier 设置为true,我认为这是默认值。
我运行了以下脚本,发现我的 SQLAgent - Job Invocation Engine 已将quoted_identifier 设置为关闭。
SELECT *
FROM sys.dm_exec_sessions
WHERE is_user_process = 1
AND quoted_identifier = 0 ;
这也许可以解释为什么我的工作失败了?但是,为什么前一天晚上成功运行的同一份工作突然失败了?
添加新索引或更改存储过程的脚本是否会导致此quoted_identifier 值为false?可以重新启动数据库吗?
显然某些事情导致了这种情况发生了变化
调用 XML 数据类型方法时,SET QUOTED_IDENTIFIER 必须为 ON。
这可以在 ODBC/OLEDB/ADO.NET 层或 SQLAGENT 中设置
MSSQL 客户端配置
某些东西更改了 SQLAgent 脚本或修改了作业参数
如果有脚本正在运行,它会更改存储过程并删除 SET 命令。是的,可以做到这一点。为什么需要更改此存储过程?