【本文引自MSDN】
使用查询通知功能的应用程序需要考虑下列特殊注意事项。
有效查询
查询通知只支持某些 Transact-SQL 语句。
首先,要支持通知,查询中不得包含下列内容:
-
派生的表。
-
行集函数。
-
UNION 运算符。
-
子查询。
-
外联接或自联接。
-
TOP 子句。
-
DISTINCT 关键字。
-
COUNT(*) 聚合函数。
-
AVG、MAX、MIN、STDEV、STDEVP、VAR 或 VARP 聚合函数。
-
用户定义的聚合函数。
-
引用可空表达式的 SUM 函数。
-
完全文本谓词 CONTAINS 或 FREETEXT。
-
COMPUTE 或 COMPUTE BY 子句。
-
聚合表达式(如果在选择列表中未指定 GROUP BY)。如果指定了 GROUP BY,选择列表中必须包含 COUNT_BIG(*) 表达式,并且不能指定 HAVING、CUBE 或 ROLLUP。
-
INTO 子句。
-
将阻止结果更改的条件(例如 WHERE 1=0)。
-
FOR BROWSE(或在 SET NO_BROWSETABLE ON 的情况下运行)。
-
READPAST 锁定提示。
其次,查询不得引用下列内容:
-
临时表或表变量。
-
其他数据库或服务器中的表或视图。
-
所有其他视图或表值函数。
-
任何系统表或视图。
-
任何非确定性函数,包括评级和窗口函数。
-
任何服务器全局变量
-
任何服务中介程序队列。
-
同义词。
最后,查询必须引用基表或视图。
快速更新
使 用查询通知的应用程序必须考虑马上会出现通知的情况。服务器上的数据更改时,通知消息将发送到相应的服务中介程序队列。应用程序需要注册才能接收其他通 知。因此,如果多个应用程序快速更新某个数据集,应用程序在缓存刷新后,立即可以接收通知,检索数据,然后获取另一个更新通知。编写使用查询通知的应用程 序必须考虑此情况。如果应用程序使用不断更新的数据,可能更适合另一种数据缓存策略。
事务
如果使用已注册的通知请求对数据集进行了多处修改,并且这些更改在事务内进行,则只会发送单个通知事件。
SQL Server 的服务帐户
对于使用本地系统帐户作为服务帐户的 SQL Server 实例,应用程序不会从其接收通知。