SEND (Transact-SQL)

Berlaku untuk:SQL ServerAzure SQL Managed Instance

Mengirim pesan, menggunakan satu atau beberapa percakapan yang sudah ada.

Konvensi sintaks transact-SQL

Sintaksis

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

Catatan

Untuk melihat sintaks Transact-SQL untuk SQL Server 2014 (12.x) dan versi yang lebih lama, lihat Dokumentasi versi sebelumnya.

Argumen

PADA CONVERSATION_HANDLE PERCAKAPAN [.. @conversation_handle_n]
Menentukan percakapan tempat pesan berada. conversation_handle harus berisi pengidentifikasi percakapan yang valid. Handel percakapan yang sama tidak dapat digunakan lebih dari sekali.

JENIS PESAN message_type_name
Menentukan tipe pesan pesan terkirim. Jenis pesan ini harus disertakan dalam kontrak layanan yang digunakan oleh percakapan ini. Kontrak ini harus memungkinkan jenis pesan dikirim dari sisi percakapan ini. Misalnya, layanan target percakapan hanya dapat mengirim pesan yang ditentukan dalam kontrak sebagai TARGET SENT BY atau DIKIRIM OLEH ANY. Jika klausa ini dihilangkan, pesan adalah dari jenis pesan DEFAULT.

message_body_expression
Menyediakan ekspresi yang mewakili isi pesan. message_body_expression bersifat opsional. Namun, jika message_body_expression ada ekspresi harus dari jenis yang dapat dikonversi ke varbinary(max). Ekspresi tidak boleh NULL. Jika klausa ini dihilangkan, isi pesan kosong.

Keterangan

Penting

Jika pernyataan SEND bukan pernyataan pertama dalam prosedur batch atau tersimpan, pernyataan sebelumnya harus dihentikan dengan titik koma (;).

Pernyataan SEND mengirimkan pesan dari layanan di salah satu ujung satu atau beberapa percakapan Service Broker ke layanan di ujung lain percakapan ini. Pernyataan RECEIVE kemudian digunakan untuk mengambil pesan terkirim dari antrean yang terkait dengan layanan target.

Handel percakapan yang disediakan ke klausul ON CONVERSATION berasal dari salah satu dari tiga sumber:

  • Saat pesan terkirim tidak merespons pesan yang diterima dari layanan lain, gunakan handel percakapan yang kembali dari pernyataan BEGIN DIALOG yang membuat percakapan.

  • Saat pesan terkirim adalah respons terhadap pesan yang sebelumnya diterima dari layanan lain, gunakan handel percakapan yang dikembalikan oleh pernyataan RECEIVE yang mengembalikan pesan asli.

  • Kode yang berisi pernyataan SEND terkadang terpisah dari kode yang berisi pernyataan BEGIN DIALOG atau RECEIVE yang menyediakan handel percakapan. Dalam kasus ini, handel percakapan harus menjadi salah satu item data dalam informasi status yang diteruskan ke kode yang berisi pernyataan KIRIM.

Pesan yang dikirim ke layanan dalam instans lain dari Mesin Database SQL Server disimpan dalam antrean transmisi dalam database saat ini hingga dapat ditransmisikan ke antrean layanan dalam instans jarak jauh. Pesan yang dikirim ke layanan dalam instans yang sama dari Mesin Database dimasukkan langsung ke dalam antrean yang terkait dengan layanan ini. Jika kondisi mencegah pesan lokal langsung masuk ke antrean layanan target, antrean transmisi dapat menyimpannya hingga kondisi selesai. Contoh kemunculan ini mencakup beberapa jenis kesalahan atau antrean layanan target yang tidak aktif. Anda dapat menggunakan tampilan sistem sys.transmission_queue untuk melihat pesan dalam antrean transmisi.

SEND adalah pernyataan atomik. Jika pernyataan SEND mengirim pesan pada beberapa percakapan dan gagal, seperti ketika percakapan dalam status kesalahan, tidak ada pesan yang disimpan dalam antrean transmisi atau dimasukkan ke dalam antrean layanan target apa pun.

Service Broker mengoptimalkan penyimpanan dan transmisi pesan yang dikirim pada beberapa percakapan dalam pernyataan SEND yang sama.

Pesan dalam antrean transmisi untuk instans dikirimkan secara berurutan berdasarkan:

  • Tingkat prioritas titik akhir percakapan terkait.

  • Dalam tingkat prioritas, urutan pengiriman mereka dalam percakapan.

Tingkat prioritas yang ditentukan dalam prioritas percakapan hanya diterapkan ke pesan dalam antrean transmisi jika opsi database HONOR_BROKER_PRIORITY diatur ke AKTIF. Jika HONOR_BROKER_PRIORITY diatur ke NONAKTIF, semua pesan dalam antrean transmisi untuk database tersebut akan diberi tingkat prioritas default 5. Tingkat prioritas tidak diterapkan ke KIRIM di mana pesan dimasukkan langsung ke dalam antrean layanan dalam instans Mesin Database yang sama.

Pernyataan SEND secara terpisah mengunci setiap percakapan tempat pesan dikirim untuk memastikan pengiriman per percakapan yang dipesan.

SEND tidak valid dalam fungsi yang ditentukan pengguna.

Izin

Untuk mengirim pesan, pengguna saat ini harus memiliki izin RECEIVE pada antrean setiap layanan yang mengirim pesan.

Contoh

Contoh berikut memulai dialog dan mengirim pesan XML pada dialog. Untuk mengirim pesan, contoh mengonversi objek xml menjadi 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);

Contoh berikut memulai tiga dialog dan mengirim pesan XML pada masing-masing dialog.

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

Lihat Juga

MULAI PERCAKAPAN DIALOG (Transact-SQL)
AKHIRI PERCAKAPAN (Transact-SQL)
RECEIVE (Transact-SQL)
sys.transmission_queue (T-SQL)