sql查询通知-更新失败,因为以下设置选项的设置不正确:“quoted\u identifier”

szqfcxe2  于 2021-08-09  发布在  Java
关注(0)|答案(1)|浏览(288)

我的问题与更新失败有关,因为以下设置选项的设置不正确:“quoted\u identifier”。
我正在使用sql查询通知从数据库中为我的应用程序启用缓存,遇到了一个我无法完全解释的奇怪行为。
如果我运行一些sql查询通知代码

using (SqlCommand command=new SqlCommand("SELECT MyColumn1, MyColumn2, etc... FROM dbo.StockSupplierCode", connection))
{
    SqlDependency dependency=new SqlDependency(command);
    dependency.OnChange += new OnChangeEventHandler(OnDependencyChange);
    command.ExecuteReader();    
}

第一次在数据库上运行此命令后,如果尝试更新受影响的表,则会出现以下错误:
msg 1934,level 16,state 1,procedure stock\u nonittrigger,line 14[batch start line 0]update failed because the following set options has incorrect settings:'quoted\u identifier'。验证set options是否正确用于索引视图和/或计算列上的索引和/或筛选索引和/或查询通知和/或xml数据类型方法和/或空间索引操作。
这个错误特别指的是它发生在我的数据库中名为 Stock_NonIntTrigger .
现在,每当我随后尝试更新此表时,此错误都将持续存在。
但是,如果我打开这个触发器,不做任何更改并重新保存,错误就会消失。
我唯一的假设是,当我重新保存这个触发器时,sql查询分析器可能正在语法上添加引号\标识符,但是当我使用 sp_helptext 它看起来不受影响,与原作完全相同。
然而,这些更新现在将会成功。
任何能够提供以下见解的人:
为什么查询通知会导致此错误?
为什么重新保存触发器会使错误消失?

vulvrdjw

vulvrdjw1#

这个 QUOTED_IDENTIFIER 以及 ANSI_NULL 创建触发器时有效的会话设置作为对象元数据持久化。它们在运行时使用,并覆盖触发器范围内的当前会话设置。此行为也适用于存储过程、函数和视图。
注意确保两者 QUOTED_IDENTIFIER 以及 ANSI_NULL 在创建对象时启用。这些选项在ssms中默认是打开的,但由于向后兼容的原因,不能与sqlcmd一起使用。我建议你一定要详细说明 -I sqlcmd参数以打开带引号的标识符以避免此问题。
关于查询通知,SQLServer要求正确设置“magic7”会话选项才能使用此功能。以下是索引视图和筛选索引等其他功能所需的相同选项:

SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
SET ARITHABORT ON
SET CONCAT_NULL_YIELDS_NULL ON
SET NUMERIC_ROUNDABORT OFF
SET QUOTED_IDENTIFIER ON

默认情况下,所有这些选项都由具有SQLServer2005+数据库兼容性级别的现代SQLServerAPI正确设置。但是,由于不注意细节,持久化设置是一个常见的问题。

相关问题