GET CONVERSATION GROUP (Transact-SQL)
針對下一則要接收的訊息,傳回交談群組識別碼,並且針對含有該訊息的交談,鎖定交談群組。您可以利用交談群組識別碼,先擷取交談狀態資訊,再擷取訊息本身。
語法
[ WAITFOR ( ]
GET CONVERSATION GROUP @conversation_group_id
FROM <queue>
[ ) ] [ , TIMEOUT timeout ]
[ ; ]
<queue> ::=
{
[ database_name . [ schema_name ] . | schema_name . ] queue_name
}
引數
WAITFOR
指定如果目前沒有訊息,GET CONVERSATION GROUP 陳述式便會等待訊息到達佇列。@conversation\_group\_id
這是一個變數,用來儲存 GET CONVERSATION GROUP 陳述式所傳回的交談群組識別碼。這個變數的類型必須是 uniqueidentifier。如果沒有可用的交談群組,變數就設為 NULL。FROM
指定佇列,從中取得交談群組。database_name
這是包含要取得交談群組所在之佇列的資料庫名稱。若未提供 database_name,預設為目前的資料庫。schema_name
這是擁有要取得交談群組所在佇列的結構描述名稱。若未提供 schema_name,預設為目前使用者的預設結構描述。queue_name
這是取得交談群組所在的佇列名稱。TIMEOUT timeout
指定 Service Broker 等待訊息到達佇列的時間長度 (以毫秒為單位)。這個子句只適用於 WAITFOR 子句。如果使用 WAITFOR 的陳述式不包含這個子句,或者 timeout 為 -1,則等候時間沒有限制。如果已經到期,GET CONVERSATION GROUP 會將 @conversation\_group\_id 變數設為 NULL。
備註
重要事項 |
---|
如果 GET CONVERSATION GROUP 陳述式不是批次或預存程序中的第一個陳述式,就必須利用 Transact-SQL 陳述式結束字元 (也就是分號 (;)) 來結束前一個陳述式。 |
如果 GET CONVERSATION GROUP 陳述式中指定的佇列無法使用,陳述式便會發生 Transact-SQL 錯誤而失敗。
此陳述式會傳回以下所有條件都成立的下一個交談群組:
交談群組可以成功鎖定。
交談群組在佇列中有可用的訊息。
在符合之前列出之準則的所有交談群組中,此交談群組具有最高的優先權等級。交談群組的優先權等級為指派給任何交談的最高優先權等級 (此交談必須為此群組的成員,而且在佇列中有訊息)。
如果接著再呼叫同一交易中的 GET CONVERSATION GROUP,可能會鎖定不只一個交談群組。如果沒有可用的交談群組,陳述式便會傳回 NULL 當作交談群組的識別碼。
在指定 WAITFOR 子句時,陳述式會等候指定的逾期時間到達,或者等到出現可用的交談群組為止。如果佇列在陳述式等候時被卸除,陳述式會立即傳回錯誤。
在使用者自訂函數中,GET CONVERSATION GROUP 無效。
權限
若要從佇列取得交談群組識別碼,目前使用者必須有佇列的 RECEIVE 權限。
範例
A. 取得交談群組,無限期等候
下列範例會將 @conversation\_group\_id 設定為 ExpenseQueue 中下一個可用訊息的交談群組識別碼。命令會等到訊息成為可用訊息為止。
DECLARE @conversation_group_id UNIQUEIDENTIFIER ;
WAITFOR (
GET CONVERSATION GROUP @conversation_group_id
FROM ExpenseQueue
) ;
B. 取得交談群組,等候一分鐘
下列範例會將 @conversation\_group\_id 設定為 ExpenseQueue 中下一個可用訊息的交談群組識別碼。如果一分鐘內還沒有出現可用訊息,GET CONVERSATION GROUP 便會傳回,而不改變 @conversation\_group\_id 的值。
DECLARE @conversation_group_id UNIQUEIDENTIFIER
WAITFOR (
GET CONVERSATION GROUP @conversation_group_id
FROM ExpenseQueue ),
TIMEOUT 60000 ;
C. 取得交談群組,立即傳回
下列範例會將 @conversation\_group\_id 設定為 ExpenseQueue 中下一個可用訊息的交談群組識別碼。如果沒有可用訊息,GET CONVERSATION GROUP 便會立即傳回,而不變更 @conversation\_group\_id。
DECLARE @conversation_group_id UNIQUEIDENTIFIER ;
GET CONVERSATION GROUP @conversation_group_id
FROM AdventureWorks.dbo.ExpenseQueue ;