专注,勤学,慎思。戒骄戒躁,谦虚谨慎

just do it

导航

SQLServer agent竟然是以quoted_identifier off的模式运行的

现象,某Job执行报错:

DELETE failed because the following SET options have incorrect settings: 'QUOTED_IDENTIFIER'. Verify that SET options are correct for use with indexed views and/or indexes on computed columns and/or filtered indexes and/or query notifications and/or XML data type methods and/or spatial index operations. [SQLSTATE 42000] (Error 1934)|
类似如下(非权限问题,正常情况下不会出错,截图是刻意重现的)

抠出来job里的SQL脚本,SSMS执行完全没有问题,让人一头雾水。

 

然后无语的事情来了,查阅资料后发现是跟quoted_identifier模式有关,我RNM的SQLServer呀,Agent Session竟然是以quoted_identifier off的模式运行的,然后问题的发生是这样的:agent的Session是以quoted_identifier  off的模式运行的,SQLServer中如果有filter index的表,不允许在uoted_identifier  off的session中执行删除。无语吧,感觉风马牛不相及,但是凑在一块就是会出问题。

quoted_identifier 是一个对于双引号是否作为标识符的开关,一般都设置为ON,唯一设置的区别就是设置为ON时,双引号可以包住元数据的名字(列名,表名),OFF的时候不能用双引号包住元数据的名字(列名,表名),包住之后会被解释为字符串。
但是Agent里为什么设置为OFF?即便设置为OFF,又为什么跟filtered index扯上什么关系?所以想不明白这种风马牛不相及的问题能导致bug。。。。。。

1. QUOTED_IDENTIFIER 为 ON 时

SET QUOTED_IDENTIFIER ON;
-- 使用双引号引用标识符
SELECT "FirstName" FROM "Employees";
-- 使用单引号引用字符串
SELECT * FROM Employees WHERE LastName = 'Smith';


2. QUOTED_IDENTIFIER 为 OFF 时

SET QUOTED_IDENTIFIER OFF;
-- 双引号被视为字符串常量
SELECT "FirstName" FROM Employees; -- 错误:'FirstName' 被解释为字符串,而不是列名
-- 使用方括号引用标识符
SELECT [FirstName] FROM [Employees];
-- 使用单引号引用字符串
SELECT * FROM Employees WHERE LastName = 'Smith';

 

 

参考:https://dba.stackexchange.com/questions/257629/update-failed-because-the-following-set-options-have-incorrect-settings-quoted

 

posted on 2025-03-06 15:06  MSSQL123  阅读(55)  评论(0)    收藏  举报