SEND (Transact-SQL)

利用現有的交談來傳送訊息。

主題連結圖示Transact-SQL 語法慣例

語法

SEND
   ON CONVERSATION conversation_handle
   [ MESSAGE TYPE message_type_name ]
   [ ( message_body_expression ) ]
[ ; ]

引數

  • ON CONVERSATION conversation_handle
    指定訊息所屬的交談。conversation_handle 必須包含有效的交談識別碼。

  • MESSAGE TYPE message_type_name
    指定所傳送之訊息的訊息類型。這個訊息類型必須包括在這項交談所用的服務合約中。合約必須允許從交談的這一端傳送這個訊息類型。例如,交談的目標只能以 SENT BY TARGET 或 SENT BY ANY 的方式來傳送合約所指定的訊息。如果省略這個子句,訊息的訊息類型便是 DEFAULT。

  • message_body_expression
    提供代表訊息主體的運算式。message_body_expression 是選擇性的。不過,如果 message_body_expression 存在,運算式的類型必須能夠轉換成 varbinary(max)。運算式不能是 NULL。如果省略這個子句,訊息主體就是空白的。

備註

重要注意事項重要事項

如果 SEND 陳述式不是批次或預存程序中的第一個陳述式,就必須利用分號 (;) 來結束前一個陳述式。

SEND 陳述式會將 Service Broker 交談某一端上服務的訊息傳輸到交談另一端上的服務。然後會使用 RECEIVE 陳述式來從與目的地服務有關的佇列中擷取傳送的訊息。

提供給 ON CONVERSATION 子句的交談控制代碼來自以下兩個來源的其中一個:

  • 當傳送的訊息不是要回應從另一個服務所接收而來的訊息時,請使用建立此交談之 BEGIN DIALOG 陳述式傳回的交談控制代碼。

  • 當傳送的訊息是要回應之前從另一個服務所接收而來的訊息時,請使用之前傳回原始訊息之 RECEIVE 陳述式所傳回的交談控制代碼。

在大多數情況下,包含 SEND 陳述式的程式碼會與包含提供交談控制代碼之 BEGIN DIALOG 或 RECEIVE 陳述式的程式碼分開。在這些情況下,交談控制代碼必須是傳遞給包含 SEND 陳述式之程式碼的狀態資訊內的其中一個資料項目。

傳送給另一個 SQL Server Database Engine 執行個體中之服務的訊息會儲存在目前資料庫的傳輸佇列中,直到可以將這些訊息傳輸到遠端執行個體內的服務佇列為止。傳送至相同 Database Engine 執行個體內之服務的訊息,將會直接放入與該服務相關的佇列中。如果某個狀況阻止將本機訊息直接放入目的地服務佇列中,可以將該訊息儲存在傳輸佇列中,直到解決該狀況為止。發生此狀況的例子包括某些錯誤類型或是目的地服務佇列不在使用中。您可以使用 sys.transmission_queue 系統檢視表來查看傳輸佇列中的訊息。

執行個體之傳輸佇列中的訊息會依照下列順序傳輸:

  • 其相關之交談端點的優先權等級。

  • 其在優先權等級內的交談中傳送順序。

如果 HONOR_BROKER_PRIORITY 資料庫選項設定為 ON,在交談優先權中指定的優先權等級只會套用至傳輸佇列中的訊息。如果 HONOR_BROKER_PRIORITY 設定為 OFF,則放置於該資料庫之傳輸佇列中的所有訊息都會使用預設優先權等級 5 加以指派。優先權等級不會套用到 SEND,此狀況下的訊息會直接放入相同 Database Engine 執行個體內的服務佇列。

SEND 陳述式會鎖定交談控制代碼,而不是此控制代碼所屬的群組。

在使用者自訂函數中,SEND 無效。

權限

若要傳送訊息,目前的使用者必須有對話來源服務的 SEND 權限。如果服務的遠端服務繫結存在,且這個遠端服務繫結中所指定的使用者必須有對話來源服務之佇列的 RECEIVE 權限。

範例

下列範例會啟動一個對話,且會在對話中傳送一則 XML 訊息。為了傳送訊息,此範例會將 xml 物件轉換成 varbinary(max)。

DECLARE @dialog_handle UNIQUEIDENTIFIER,
        @ExpenseReport XML ;

SET @ExpenseReport = < construct message as appropriate for the application > ;

BEGIN DIALOG @dialog_handle
FROM SERVICE [//Adventure-Works.com/Expenses/ExpenseClient]
TO SERVICE '//Adventure-Works.com/Expenses'
ON CONTRACT [//Adventure-Works.com/Expenses/ExpenseProcessing] ;


SEND ON CONVERSATION @dialog_handle
    MESSAGE TYPE [//Adventure-Works.com/Expenses/SubmitExpense]
    (@ExpenseReport) ;