我的问题与更新失败有关,因为以下设置选项的设置不正确:“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
它看起来不受影响,与原作完全相同。
然而,这些更新现在将会成功。
任何能够提供以下见解的人:
为什么查询通知会导致此错误?
为什么重新保存触发器会使错误消失?
1条答案
按热度按时间vulvrdjw1#
这个
QUOTED_IDENTIFIER
以及ANSI_NULL
创建触发器时有效的会话设置作为对象元数据持久化。它们在运行时使用,并覆盖触发器范围内的当前会话设置。此行为也适用于存储过程、函数和视图。注意确保两者
QUOTED_IDENTIFIER
以及ANSI_NULL
在创建对象时启用。这些选项在ssms中默认是打开的,但由于向后兼容的原因,不能与sqlcmd一起使用。我建议你一定要详细说明-I
sqlcmd参数以打开带引号的标识符以避免此问题。关于查询通知,SQLServer要求正确设置“magic7”会话选项才能使用此功能。以下是索引视图和筛选索引等其他功能所需的相同选项:
默认情况下,所有这些选项都由具有SQLServer2005+数据库兼容性级别的现代SQLServerAPI正确设置。但是,由于不注意细节,持久化设置是一个常见的问题。