為通知建立查詢

查詢通知功能建立在 Database Engine 用來維護索引檢視表的變更偵測機制上。通知查詢中陳述式的需求與限制類似於索引檢視表的需求與限制。

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)>。

當註冊通知的命令包含多個陳述式時,Database Engine 會為批次中的每個陳述式建立一個通知。

支援的 SELECT 陳述式

符合下列需求的 SELECT 陳述式就支援查詢通知:

  • SELECT 陳述式中預計的資料行必須加以明確陳述,且資料表名稱必須限定為兩個部分名稱。請注意,這表示陳述式中參考的所有資料表都必須在相同資料庫內。

  • 陳述式不能使用星號 (*) 或 table_name.* 語法來指定資料行。

  • 陳述式不能使用未命名的資料行或重複的資料行名稱。

  • 陳述式必須參考基底資料表。

  • 陳述式不能參考含有計算資料行的資料表。

  • 除非陳述式使用 GROUP BY 運算式,否則 SELECT 陳述式中預計的資料行不能包含彙總運算式。如果已提供 GROUP BY 運算式,選取清單可包含彙總函式 COUNT_BIG() 或 SUM()。不過,不能對可為 Null 的資料行指定 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。

  • 陳述式絕不能參考同義字。

  • 陳述式絕不能具有以雙重/實數資料類型為基礎的比較或運算式。

  • 此陳述式不得使用 TOP 運算式。

批次和預存程序

如果訂閱要求是針對批次或預存程序所建立的,就會針對批次或預存程序內執行的每個陳述式建立個別的訂閱要求。

EXECUTE 陳述式不會註冊通知,不過會將通知要求傳送至執行的命令。如果它是批次,內容就會套用至執行的陳述式,而且上述的相同規則將適用。

重複的訂閱

重複提交使用中訂閱會導致現有的訂閱使用新的指定逾時值更新。重複的訂閱是指符合下列條件的訂閱:

  • 由相同的使用者在相同的資料庫內容下提交查詢。

  • 使用相同的範本、參數值、通知識別碼及傳送位置。

這表示如果您針對相同的查詢要求通知,就只會傳送一則通知。這適用於批次中重複的查詢,或預存程序中多次呼叫的查詢。

請參閱

參考

概念