SQL 查询通知 - 更新失败,因为以下 SET 选项设置不正确:'QUOTED_IDENTIFIER'
SQL Query Notifications - UPDATE failed because the following SET options have incorrect settings: 'QUOTED_IDENTIFIER'
我的问题与 UPDATE failed because the following SET options have incorrect settings: 'QUOTED_IDENTIFIER' 有点相关。
我正在使用 SQL Query Notifications 从数据库中为我的应用程序启用缓存,并且 运行 出现了一种我无法完全解释的奇怪行为。
如果我运行一些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();
}
运行第一次在我的数据库上进行此操作后,如果我尝试更新受影响的 table,我会收到错误消息:
Msg 1934, Level 16, State 1, Procedure Stock_NonIntTrigger, Line 14 [Batch Start Line 0]
UPDATE 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.
该错误具体指的是它发生在我的数据库中名为 Stock_NonIntTrigger
的命名触发器中。
此错误现在将在我随后尝试更新此 table 的任何时候持续存在。
HOWEVER if I open this trigger, change nothing and resave it, the
error disappears.
我唯一的假设是,当我重新保存此触发器时,SQL 查询分析器可能会添加 QUOTE_IDENTIFIER ON 语法,但是当我使用 sp_helptext
重新打开同一触发器时,它似乎不受影响和原来的一样。
但是现在更新将会成功。
任何能够提供任何见解的人:
- 为什么查询通知会导致此错误?
- 为什么重新保存触发器会使错误消失?
创建触发器时有效的 QUOTED_IDENTIFIER
和 ANSI_NULL
会话设置是 persisted as object meta-data。这些在 运行 时间使用并覆盖触发器范围内的当前会话设置。此行为也适用于存储过程、函数和视图。
创建对象时注意确保 QUOTED_IDENTIFIER
和 ANSI_NULL
都打开。这些选项在 SSMS 中默认启用,但出于向后兼容性原因,SQLCMD 不启用。我建议总是指定 -I
SQLCMD 参数来打开带引号的标识符以避免这个问题。
关于查询通知,SQL 服务器需要正确设置 "magic 7" 会话选项才能使用此功能。这些是索引视图和过滤索引等其他功能所需的相同选项:
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
现代 SQL 服务器 API 与 SQL Server 2005+ 数据库兼容性级别默认正确设置所有这些选项。但是,由于不注意细节,持久化设置是一个常见问题。
我的问题与 UPDATE failed because the following SET options have incorrect settings: 'QUOTED_IDENTIFIER' 有点相关。
我正在使用 SQL Query Notifications 从数据库中为我的应用程序启用缓存,并且 运行 出现了一种我无法完全解释的奇怪行为。
如果我运行一些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();
}
运行第一次在我的数据库上进行此操作后,如果我尝试更新受影响的 table,我会收到错误消息:
Msg 1934, Level 16, State 1, Procedure Stock_NonIntTrigger, Line 14 [Batch Start Line 0] UPDATE 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.
该错误具体指的是它发生在我的数据库中名为 Stock_NonIntTrigger
的命名触发器中。
此错误现在将在我随后尝试更新此 table 的任何时候持续存在。
HOWEVER if I open this trigger, change nothing and resave it, the error disappears.
我唯一的假设是,当我重新保存此触发器时,SQL 查询分析器可能会添加 QUOTE_IDENTIFIER ON 语法,但是当我使用 sp_helptext
重新打开同一触发器时,它似乎不受影响和原来的一样。
但是现在更新将会成功。
任何能够提供任何见解的人:
- 为什么查询通知会导致此错误?
- 为什么重新保存触发器会使错误消失?
创建触发器时有效的 QUOTED_IDENTIFIER
和 ANSI_NULL
会话设置是 persisted as object meta-data。这些在 运行 时间使用并覆盖触发器范围内的当前会话设置。此行为也适用于存储过程、函数和视图。
创建对象时注意确保 QUOTED_IDENTIFIER
和 ANSI_NULL
都打开。这些选项在 SSMS 中默认启用,但出于向后兼容性原因,SQLCMD 不启用。我建议总是指定 -I
SQLCMD 参数来打开带引号的标识符以避免这个问题。
关于查询通知,SQL 服务器需要正确设置 "magic 7" 会话选项才能使用此功能。这些是索引视图和过滤索引等其他功能所需的相同选项:
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
现代 SQL 服务器 API 与 SQL Server 2005+ 数据库兼容性级别默认正确设置所有这些选项。但是,由于不注意细节,持久化设置是一个常见问题。