END CONVERSATION (Transact-SQL)

Şunlar için geçerlidir: SQL Server Azure SQL Yönetilen Örneği

Mevcut bir konuşmanın bir tarafını bitirir.

Transact-SQL söz dizimi kuralları

Syntax

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

Arguments

conversation_handle
Konuşmanın bitmesi için konuşma adı.

HATA =failure_code
Hata kodu bu. failure_codetür bir int. Arıza kodu, konuşmanın diğer tarafına gönderilen hata mesajına dahil edilen kullanıcı tarafından tanımlanan bir koddur. Arıza kodu 0'dan büyük olmalıdır.

AÇIKLAMA =failure_text
Hata mesajı. failure_textnvarchar(3000) tipindendir. Arıza metni, konuşmanın diğer tarafına gönderilen hata mesajına dahil edilen kullanıcı tanımlı metindir.

TEMIZLIKLE
Normal şekilde tamamlanamayan bir konuşma tarafı için tüm mesajları ve katalog görünümü girişlerini kaldırır. Konuşmanın diğer tarafına temizlik haberi verilmiyor. Microsoft SQL Server, iletişim uç noktasını, iletişim kuyruğundaki tüm mesajları ve hizmet kuyruğundaki tüm konuşma mesajlarını kaldırıyor. Yöneticiler, normal şekilde tamamlanamayan konuşmaları kaldırmak için bu seçeneği kullanabilir. Örneğin, uzaktan hizmet kalıcı olarak kaldırıldıysa, bir yönetici WITH CLEANUP ile o hizmete yapılan konuşmaları kaldırabilir. Bir Hizmet Brokerı uygulamasının kodunda WITH CLEANUP (WITH CLEANUP) kelimesini kullanmayın. Eğer END CONVERSATION WITH CLEANUP işlemi işlemi alınan uç nokta mesajı aldığını onaylamadan önce çalıştırılırsa, gönderen uç nokta mesajı tekrar gönderir. Bu potansiyel olarak diyalogu tekrar çalıştırabilir.

Remarks

Bir konuşmayı bitirmek, verilen conversation_handle ait olduğu konuşma grubunu kilitler. Bir konuşma sona erdiğinde, Service Broker hizmet kuyruğundan konuşma için tüm mesajları kaldırır.

Bir konuşma sona erdikten sonra, bir uygulama artık o konuşma için mesaj gönderip alamaz. Konuşmanın tamamlanması için her iki katılımcı da çağrı END CONVERSATION yapmalıdır. Hizmet Brokerı, konuşmadaki diğer katılımcıdan bir son diyalog mesajı veya Hata mesajı almadıysa, Hizmet Aracı konuşmanın sona erdiğini bildirir. Bu durumda, konuşma için konuşma tutamacı artık geçerli olmasa da, konuşmanın uç noktası, uzaktan hizmeti barındıran örnek mesajı onaylayana kadar aktif kalır.

Service Broker konuşma için son diyalogu veya hata mesajı işlememişse, konuşmanın uzak tarafına konuşmanın sona erdiğini bildirir. Service Broker'ın uzaktan servise gönderdiği mesajlar, belirtilen seçeneklere bağlıdır:

  • Konuşma hatasız sona ererse ve uzaktan hizmetle yapılan konuşma hâlâ aktifse, Service Broker uzaktan servise bir tür https://schemas.microsoft.com/SQL/ServiceBroker/EndDialog mesaj gönderir. Service Broker, bu mesajı iletişim sırasına konuşma sırasına ekler. Service Broker, bu mesajı göndermeden önce şu anda iletim kuyruğunda olan tüm mesajları bu konuşma için gönderir.

  • Konuşma bir hata ile sona ererse ve uzaktan hizmetle yapılan konuşma hâlâ aktifse, Service Broker uzaktan servise türde https://schemas.microsoft.com/SQL/ServiceBroker/Error bir mesaj gönderir. Service Broker, şu anda iletim kuyruğunda olan bu konuşma için diğer mesajları gönderiyor.

  • WITH CLEANUP maddesi, veritabanı yöneticisinin normal şekilde tamamlanamayan konuşmaları kaldırmasına izin verir. Bu seçenek, konuşma için tüm mesajları ve katalog görünümü girişlerini kaldırır. Bu durumda, konuşmanın uzak tarafı konuşmanın bittiğine dair hiçbir işaret almaz ve bir uygulama tarafından gönderilen ancak ağ üzerinden iletilmemiş mesajları almayabilir. Konuşma normal şekilde tamamlanamazsa bu seçeneğin önüne geçin.

Bir konuşma sona erdikten sonra, konuşma tutamacını belirten Transact-SQL SEND bir ifade Transact-SQL hatasına neden olur. Bu konuşma için mesajlar diğer taraftan gelirse, Service Broker bu mesajları reddeder.

Bir konuşma, uzaktan hizmet hâlâ gönderilmemiş mesajlara sahipken sona ererse, uzaktan hizmet gönderilmemiş mesajları kaldırır. Bu hata olarak kabul edilmez ve uzaktan servis mesajların düşürüldüğüne dair herhangi bir bildirim almıyor.

WITH ERROR maddesinde belirtilen arıza kodları pozitif sayılar olmalıdır. Negatif sayılar Service Broker hata mesajları için ayrılmıştır.

END CONVERSATION kullanıcı tanımlı bir fonksiyonda geçerli değildir.

Permissions

Aktif bir konuşmayı sonlandırmak için, mevcut kullanıcı konuşmanın sahibi, sistem yöneticisi sabit sunucu rolünün üyesi veya db_owner sabit veritabanı rolünün üyesi olmalıdır.

Sysadmin sabit sunucu rolünün bir üyesi veya db_owner sabit veritabanı rolünün bir üyesi, WITH CLEANUP ile zaten tamamlanmış bir konuşmanın meta verilerini kaldırabilir.

Examples

A. Bir konuşmayı bitirmek

Aşağıdaki örnek, belirtilen diyalogu sonlandırır @dialog_handle.

END CONVERSATION @dialog_handle ;  

B. Bir konuşmayı bir hatayla bitirmek

Aşağıdaki örnek, işlem ifadesi hata bildirirse belirtilen diyalogu @dialog_handle bir hata ile sonlandırır. Unutmayın ki bu, hata işleme için basit bir yaklaşımdır ve bazı uygulamalar için uygun olmayabilir.

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. Normalde tamamlanamayan bir konuşmayı temizlemek

Aşağıdaki örnek, belirtilen diyalogu sonlandırır @dialog_handle. SQL Server, uzaktan servise bildirim vermeden hemen tüm mesajları servis kuyruğundan ve iletim kuyruğundan kaldırır. Bir diyalogu temizleme ile bitirmek uzaktan servisi bilgilendirmediğinden, bunu yalnızca uzaktan servisin EndDialog veya Hata mesajı almaya uygun olmadığı durumlarda kullanmalısınız.

END CONVERSATION @dialog_handle WITH CLEANUP;  

Ayrıca Bkz.

BEGIN CONVERSATION TIMER (Transact-SQL)
BEGIN DIALOG CONVERSATION (Transact-SQL)
sys.iletişim_bitiş_noktaları (Transact-SQL)