Bagikan melalui


AKHIRI PERCAKAPAN (Transact-SQL)

Berlaku untuk: SQL Server Azure SQL Managed Instance

Mengakhiri satu sisi percakapan yang sudah ada.

Konvensi sintaks transact-SQL

Sintaks

END CONVERSATION conversation_handle  
   [   [ WITH ERROR = failure_code DESCRIPTION = 'failure_text' ]  
     | [ WITH CLEANUP ]  
    ]  
[ ; ]  

Argumen

conversation_handle
Apakah handel percakapan untuk percakapan berakhir.

DENGAN KESALAHAN =failure_code
Adalah kode kesalahan. failure_code berjenis int. Kode kegagalan adalah kode yang ditentukan pengguna yang disertakan dalam pesan kesalahan yang dikirim ke sisi lain percakapan. Kode kegagalan harus lebih besar dari 0.

DESKRIPSI =failure_text
Adalah pesan kesalahan. Failure_text berjenis nvarchar(3000). Teks kegagalan adalah teks yang ditentukan pengguna yang disertakan dalam pesan kesalahan yang dikirim ke sisi lain percakapan.

DENGAN PEMBERSIHAN
Menghapus semua pesan dan entri tampilan katalog untuk satu sisi percakapan yang tidak dapat diselesaikan secara normal. Sisi lain percakapan tidak diberi tahu tentang pembersihan. Microsoft SQL Server menghilangkan titik akhir percakapan, semua pesan untuk percakapan dalam antrean transmisi, dan semua pesan untuk percakapan dalam antrean layanan. Administrator dapat menggunakan opsi ini untuk menghapus percakapan yang tidak dapat diselesaikan secara normal. Misalnya, jika layanan jarak jauh telah dihapus secara permanen, administrator dapat menggunakan WITH CLEANUP untuk menghapus percakapan ke layanan tersebut. Jangan gunakan WITH CLEANUP dalam kode aplikasi Service Broker. Jika END CONVERSATION WITH CLEANUP dijalankan sebelum titik akhir penerimaan mengakui menerima pesan, titik akhir pengiriman akan mengirim pesan lagi. Ini berpotensi menjalankan kembali dialog.

Keterangan

Mengakhiri percakapan mengunci grup percakapan tempat conversation_handle disediakan. Saat percakapan berakhir, Service Broker menghapus semua pesan untuk percakapan dari antrean layanan.

Setelah percakapan berakhir, aplikasi tidak dapat lagi mengirim atau menerima pesan untuk percakapan tersebut. Kedua peserta dalam percakapan harus memanggil END CONVERSATION agar percakapan selesai. Jika Service Broker belum menerima pesan dialog akhir atau pesan Kesalahan dari peserta lain dalam percakapan, Service Broker memberi tahu peserta lain dalam percakapan bahwa percakapan telah berakhir. Dalam hal ini, meskipun handel percakapan untuk percakapan tidak lagi valid, titik akhir untuk percakapan tetap aktif sampai instans yang menghosting layanan jarak jauh mengakui pesan.

Jika Service Broker belum memproses dialog akhir atau pesan kesalahan untuk percakapan, Service Broker memberi tahu sisi jarak jauh percakapan bahwa percakapan telah berakhir. Pesan yang dikirim Service Broker ke layanan jarak jauh bergantung pada opsi yang ditentukan:

  • Jika percakapan berakhir tanpa kesalahan, dan percakapan ke layanan jarak jauh masih aktif, Service Broker mengirimkan pesan jenis https://schemas.microsoft.com/SQL/ServiceBroker/EndDialog ke layanan jarak jauh. Service Broker menambahkan pesan ini ke antrean transmisi dalam urutan percakapan. Service Broker mengirim semua pesan untuk percakapan ini yang saat ini berada dalam antrean transmisi sebelum mengirim pesan ini.

  • Jika percakapan berakhir dengan kesalahan dan percakapan ke layanan jarak jauh masih aktif, Service Broker mengirimkan pesan jenis https://schemas.microsoft.com/SQL/ServiceBroker/Error ke layanan jarak jauh. Service Broker menghilangkan pesan lain untuk percakapan ini saat ini dalam antrean transmisi.

  • Klausa WITH CLEANUP memungkinkan administrator database untuk menghapus percakapan yang tidak dapat diselesaikan secara normal. Opsi ini menghapus semua pesan dan entri tampilan katalog untuk percakapan. Perhatikan bahwa, dalam hal ini, sisi jarak jauh percakapan tidak menerima indikasi bahwa percakapan telah berakhir, dan mungkin tidak menerima pesan yang telah dikirim oleh aplikasi tetapi belum ditransmisikan melalui jaringan. Hindari opsi ini kecuali percakapan tidak dapat diselesaikan secara normal.

Setelah percakapan berakhir, pernyataan Transact-SQL SEND yang menentukan handel percakapan menyebabkan kesalahan T-SQL. Jika pesan untuk percakapan ini tiba dari sisi lain percakapan, Service Broker membuang pesan tersebut.

Jika percakapan berakhir saat layanan jarak jauh masih memiliki pesan yang tidak dikirim untuk percakapan, layanan jarak jauh akan menghapus pesan yang tidak dikirim. Ini tidak dianggap sebagai kesalahan, dan layanan jarak jauh tidak menerima pemberitahuan bahwa pesan telah dihilangkan.

Kode kegagalan yang ditentukan dalam klausul WITH ERROR harus berupa angka positif. Angka negatif dicadangkan untuk pesan kesalahan Service Broker.

END CONVERSATION tidak valid dalam fungsi yang ditentukan pengguna.

Izin

Untuk mengakhiri percakapan aktif, pengguna saat ini harus menjadi pemilik percakapan, anggota peran server tetap sysadmin atau anggota peran database tetap db_owner.

Anggota peran server tetap sysadmin atau anggota peran database tetap db_owner dapat menggunakan WITH CLEANUP untuk menghapus metadata untuk percakapan yang telah selesai.

Contoh

J. Mengakhiri percakapan

Contoh berikut mengakhiri dialog yang ditentukan oleh @dialog_handle.

END CONVERSATION @dialog_handle ;  

B. Mengakhiri percakapan dengan kesalahan

Contoh berikut mengakhiri dialog yang ditentukan dengan @dialog_handle kesalahan jika pernyataan pemrosesan melaporkan kesalahan. Perhatikan bahwa ini adalah pendekatan sederhana untuk penanganan kesalahan, dan mungkin tidak sesuai untuk beberapa aplikasi.

DECLARE
    @dialog_handle UNIQUEIDENTIFIER,
    @ErrorSave INT,
    @ErrorDesc NVARCHAR(100);

BEGIN TRANSACTION;

-- Receive and process message

SET @ErrorSave = @@ERROR;

IF (@ErrorSave <> 0)
    BEGIN
        ROLLBACK TRANSACTION;
        SET @ErrorDesc = N'An error has occurred.';
        END CONVERSATION @dialog_handle
            WITH ERROR = @ErrorSave DESCRIPTION = @ErrorDesc;
    END;
ELSE
    COMMIT TRANSACTION;

C. Membersihkan percakapan yang tidak dapat diselesaikan secara normal

Contoh berikut mengakhiri dialog yang ditentukan oleh @dialog_handle. SQL Server segera menghapus semua pesan dari antrean layanan dan antrean transmisi, tanpa memberi tahu layanan jarak jauh. Karena mengakhiri dialog dengan pembersihan tidak memberi tahu layanan jarak jauh, Anda hanya boleh menggunakan ini jika layanan jarak jauh tidak tersedia untuk menerima pesan EndDialog atau Kesalahan .

END CONVERSATION @dialog_handle WITH CLEANUP;  

Lihat Juga

MULAI TIMER PERCAKAPAN (Transact-SQL)
MULAI PERCAKAPAN DIALOG (Transact-SQL)
sys.conversation_endpoints (T-SQL)