為通知建立查詢
查詢通知功能建立在 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 陳述式不會註冊通知,不過會將通知要求傳送至執行的命令。如果它是批次,內容就會套用至執行的陳述式,而且上述的相同規則將適用。
重複的訂閱
重複提交使用中訂閱會導致現有的訂閱使用新的指定逾時值更新。重複的訂閱是指符合下列條件的訂閱:
由相同的使用者在相同的資料庫內容下提交查詢。
使用相同的範本、參數值、通知識別碼及傳送位置。
這表示如果您針對相同的查詢要求通知,就只會傳送一則通知。這適用於批次中重複的查詢,或預存程序中多次呼叫的查詢。