SEND (Transact-SQL)

適用対象:SQL ServerAzure SQL Managed Instance

1 つ以上の既存のメッセージ交換を使用してメッセージを送信します。

Transact-SQL 構文表記規則

構文

  
SEND  
   ON CONVERSATION [(]conversation_handle [,.. @conversation_handle_n][)]  
   [ MESSAGE TYPE message_type_name ]  
   [ ( message_body_expression ) ]  
[ ; ]  

引数

会話 conversation_handle [.. @conversation_handle_n]
メッセージが属するメッセージ交換を指定します。 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文は、1つ以上のサービスブローカーとの会話の一方の端にあるサービスから、その会話のもう一方のサービスへメッセージを送信します。 RECEIVE文は、ターゲットサービスに関連付けられたキューから送信されたメッセージを取得するために使われます。

ON CONVERSATION 句に指定されるメッセージ交換ハンドルのソースは、次の 3 つのうちいずれかです。

  • 別のサービスから受信したメッセージに対する応答ではないメッセージを送信する場合、メッセージ交換を作成した BEGIN DIALOG ステートメントから返されるメッセージ交換ハンドルを使用します。

  • 送信メッセージが他のサービスから以前に受信したメッセージへの応答であれば、元のメッセージを返した RECEIVE 文が返す会話ハンドルを使用します。

  • SEND文を含むコードは、BEGIN DIALOGや会話ハンドルを提供するRECEIVE文を含むコードとは別に存在することもあります。 この場合、会話ハンドルは、 SEND 文を含むコードに渡される状態情報内のデータ項目のいずれかでなければなりません。

SQL Server データベース エンジンの別のインスタンス内のサービスに送信されるメッセージは、リモート インスタンスのサービス キューに送信できるようになるまでの間、現在のデータベースの転送キューに格納されます。 データベース エンジンの同じインスタンス内のサービスに送信されるメッセージは、それらのサービスに関連付けられたキューに直接配置されます。 ローカル メッセージを転送先サービス キューに直接配置できない条件がある場合は、その条件が解決されるまで転送キューに格納されることがあります。 これが発生するのは、特定のエラーが発生した場合や、転送先サービス キューが非アクティブな場合などです。 sys.transmission_queue システム ビューを使用すると、転送キュー内のメッセージを表示できます。

SEND は原子的な命題です。 SEND文が複数の会話でメッセージを送信し失敗した場合、例えば会話がエラー状態にある場合、送信キューにメッセージが保存されず、ターゲットサービスキューにも入れられません。

Service Brokerは、同じ SEND 文内で複数の会話で送信されるメッセージの保存と送信を最適化します。

インスタンスの転送キュー内のメッセージは、次の内容に基づいて順番に転送されます。

  • 関連するメッセージ交換エンドポイントの優先度レベル。

  • 優先度レベル内では、メッセージ交換における送信順序。

メッセージ交換の優先度で指定された優先順位は、HONOR_BROKER_PRIORITY データベース オプションが ON に設定されている場合にのみ、転送キュー内のメッセージに割り当てられます。 HONOR_BROKER_PRIORITY データベース オプションが OFF に設定されている場合、そのデータベースの転送キューに配置されたすべてのメッセージには、既定の優先度レベル 5 が割り当てられます。 優先度レベルは、メッセージが同じデータベース エンジンインスタンス内のサービスキューに直接置かれる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);

次の例では、3 つのダイアログを開始し、各ダイアログ上の XML メッセージを送信します。

DECLARE
    @dialog_handle1 UNIQUEIDENTIFIER,
    @dialog_handle2 UNIQUEIDENTIFIER,
    @dialog_handle3 UNIQUEIDENTIFIER,
    @OrderMsg XML;

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

BEGIN DIALOG @dialog_handle1
    FROM SERVICE [//InitiatorDB/InitiatorService]
    TO SERVICE '//TargetDB1/TargetService'
    ON CONTRACT [//AllDBs/OrderProcessing];

BEGIN DIALOG @dialog_handle2
    FROM SERVICE [//InitiatorDB/InitiatorService]
    TO SERVICE '//TargetDB2/TargetService'
    ON CONTRACT [//AllDBs/OrderProcessing];

BEGIN DIALOG @dialog_handle3
    FROM SERVICE [//InitiatorDB/InitiatorService]
    TO SERVICE '//TargetDB3/TargetService'
    ON CONTRACT [//AllDBs/OrderProcessing];

SEND ON CONVERSATION (
    @dialog_handle1,
    @dialog_handle2,
    @dialog_handle3
)
    MESSAGE TYPE [//AllDBs/OrderMsg](@OrderMsg); 

参照

BEGIN DIALOG CONVERSATION (Transact-SQL)
END CONVERSATION (Transact-SQL)
RECEIVE (Transact-SQL)
sys.transmission_queue(Transact-SQL)