为通知创建查询
查询通知功能建立在数据库引擎用来维护索引视图的更改检测机制上。在用于通知的查询中对语句的要求和限制与对索引视图的要求和限制相似。
SET 选项设置
在通知请求下执行 SELECT 语句时,提交请求的连接的选项设置必须如下所示:
ANSI_NULLS ON
ANSI_PADDING ON
ANSI_WARNINGS ON
CONCAT_NULL_YIELDS_NULL ON
QUOTED_IDENTIFIER ON
NUMERIC_ROUNDABORT OFF
ARITHABORT ON
注意 |
---|
当数据库兼容级别设置为 90 时,如果将 ANSI_WARNINGS 设置为 ON,则将使 ARITHABORT 隐式设置为 ON。如果数据库兼容级别设置为 80 或更低,则必须将 ARITHABORT 选项显式设置为 ON。 |
不能在 READ_UNCOMMITTED 或 SNAPSHOT 隔离级别下运行该语句。
如果没有适当地设置这些选项或是隔离级别,则在执行 SELECT 语句后将立即激发通知。通知处于活动状态时,发出命令(导致通知激发)的连接也必须如上所示设置 SET 选项。否则,命令将由于 Transact-SQL 错误而失败。
如果语句包含在存储过程中,则创建存储过程时必须设置 ANSI_NULLS 选项和 QUOTED_IDENTIFIER 选项。有关详细信息,请参阅 SET ANSI_NULLS (Transact-SQL) 和 SET QUOTED_IDENTIFIER (Transact-SQL)。
设置通知的语句
通常,可以为可用于创建索引视图的任何查询请求通知。可以为下列语句设置通知:
SELECT
有关特定于 SELECT 的要求和限制,请参阅下面“支持的 SELECT 语句”。有关 SELECT 语句的详细信息,请参阅 SELECT (Transact-SQL)。
EXECUTE
在这种情况下,SQL Server 将为执行的命令而不是 EXECUTE 语句本身注册一个通知。命令必须满足 SELECT 语句的要求和限制。有关 EXECUTE 语句的详细信息,请参阅 EXECUTE (Transact-SQL)。
当注册通知的命令包含多条语句时,数据库引擎将为批处理中的每条语句创建一个通知。
支持的 SELECT 语句
满足下列要求的 SELECT 语句支持查询通知:
必须显式说明 SELECT 语句中提取的列,并且表名必须限定为两部分组成的名称。注意,这意味着语句中引用的所有表都必须处于同一数据库中。
语句不能使用星号 (*) 或 table_name.* 语法指定列。
语句不能使用未命名列或重复的列名。
语句必须引用基表。
语句不能引用具有计算列的表。
在 SELECT 语句中提取的列不能包含聚合表达式,除非语句使用 GROUP BY 表达式。提供 GROUP BY 表达式时,选择列表便可以包含聚合函数 COUNT_BIG() 或 SUM()。但是,不能为可为空的列指定 SUM()。语句不能指定 HAVING、CUBE 或 ROLLUP。
在用作简单表达式的 SELECT 语句中提取的列不能多次显示。
语句不能包含 PIVOT 或 UNPIVOT 运算符。
语句不能包含 UNION、INTERSECT 或 EXCEPT 运算符。
语句不能引用视图。
语句不能包含下列任意一个:DISTINCT、COMPUTE、COMPUTE BY 或 INTO。
语句不能引用服务器全局变量 (@@variable_name)。
语句不能引用派生表、临时表或表变量。
语句不能从其他数据库或服务器中引用表或视图。
语句不能包含子查询、外部联接或自联接。
语句不能引用下列大型对象类型:text、ntext 和 image。
语句不能使用 CONTAINS 或 FREETEXT 全文谓词。
语句不能使用行集函数,包括 OPENROWSET 和 OPENQUERY。
语句不能使用下列任何一个聚合函数:AVG、COUNT(*)、MAX、MIN、STDEV、STDEVP、VAR 或 VARP。
语句不能使用任何具有不确定性的函数,包括排名函数和开窗函数。
语句不能包含用户定义聚合。
语句不能引用系统表或视图,包括目录视图和动态管理视图。
语句不能包含 FOR BROWSE 信息。
语句不能引用队列。
语句不能包含无法更改和无法返回结果的条件语句(如 WHERE 1=0)。
语句不能指定 READPAST 锁提示。
语句不能引用任何 Service Broker QUEUE。
语句不能引用同义词。
语句不能具有基于 double/real 数据类型的比较或表达式。
语句不得使用 TOP 表达式。
批处理和存储过程
如果发出批处理或存储过程订阅请求,则会针对批处理或存储过程内执行的每个语句发出单独的订阅请求。
EXECUTE 语句不会注册通知,但是会将通知请求流式传递到已执行的命令。如果为批处理,则上下文将适用于已执行的语句,并且应用上述相同规则。
重复订阅
如果提交重复的活动订阅,则会导致使用新的指定超时值续订现有订阅。重复订阅是指满足下列条件的订阅:
同一用户在相同的数据库上下文下提交查询。
使用相同的模板、参数值、通知 ID 以及传递位置。
这意味着如果针对相同的查询请求通知,则仅发送一个通知。这适用于批处理中的重复查询,也适用于存储过程中调用多次的查询。