查询通知消息包含 XML。每个消息都包括创建该消息的原因和创建通知时包括的通知消息。
QueryNotification 元素上的属性标识消息的原因,而 Message 元素包含订阅的通知 ID。例如,以下所显示的 XML 文档是完整的查询通知消息(为确保可读性重新格式化了该文档):
<qn:QueryNotification
xmlns:qn="https://schemas.microsoft.com/SQL/Notifications/QueryNotification"
Type="change" Source="data" Info="insert">
<qn:Message>http://adventure-works.com/catalog.aspx?Category=Cars</qn:Message>
</qn:QueryNotification>
此查询通知消息报告了 INSERT 语句使用消息 (http://adventure-works.com/catalog.aspx?Category=Cars) 更改了订阅的数据。
![]() |
---|
由于该通知是被作为 XML 文档传递的,因此数据库引擎将转义在 XML 文档中无效的字符。例如,如果与订阅一起提交的消息包含字符 < ,则返回的 XML 会将此字符转义为 < ; 。 |
下表列出了每个属性的值。SQL Server 只生成某些属性组合。例如,由于 change 的 Type 要求创建订阅,因此,change 的 Type 不能与 statement 的 Source 组合。
根据 Type 属性的值进行区分,查询通知消息可分为两个主要类型。若要指明查询的结果已经更改,数据库引擎将创建 change 类型的消息。若要指明订阅请求失败,数据库引擎将创建 subscribe 类型的消息。另两个属性的值将指明 SQL Server 创建消息的确切原因。
更改消息
当进行可能影响查询结果的更改时,SQL Server 将生成 change 类型的消息。下表将说明了更改消息:
来源 | 信息 | 说明 |
---|---|---|
数据 |
截断 |
查询中引用的一个或多个表被截断。 |
数据 |
insert |
SQL Server 已对查询中引用的一个或多个表应用了 INSERT 语句。 |
数据 |
update |
SQL Server 已对查询中引用的一个或多个表应用了 UPDATE 语句。 |
数据 |
delete |
SQL Server 已对查询中引用的一个或多个表应用了 DELETE 语句。 |
超时 |
无 |
订阅超时时间已到。 |
对象 |
drop |
该查询所使用的基本对象之一已被删除。 |
对象 |
更改 |
该查询所使用的基本对象之一已被修改。 |
system |
重新启动 |
启动了 SQL Server。 |
system |
错误 |
在 SQL Server 中发生了内部错误。 |
system |
资源 |
由于 SQL Server 的状态(例如负荷很重的服务器),删除了通知订阅。 |
订阅消息
当 SQL Server 不能创建订阅时,服务器将立即生成 subscribe 类型的消息。下表说明了 subscribe 消息。
来源 | 信息 | 说明 |
---|---|---|
statement |
查询 |
已提交的命令包含不能满足查询通知要求的 SELECT 语句。 |
statement |
无效 |
已提交命令包含不支持通知的语句(例如 INSERT 或 UPDATE)。 |
statement |
以前的无效 |
在事务中的以前的命令包含不支持通知的语句(例如 INSERT 或 UPDATE) |
statement |
设置选项 |
提交命令时,没有适当地设置连接选项。 |
statement |
隔离 |
隔离级别对于查询通知无效(SNAPSHOT 隔离级别)。 |
statement |
查询模板限制 |
查询中指定的表已经达到内部模板的最大数目。 |