RECEIVE (Transact-SQL)

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

Bir kuyruktan bir veya daha fazla mesajı alır. Kuyruğun saklama ayarına bağlı olarak, ya mesajı kuyruktan kaldırır ya da kuyruk içindeki mesajın durumunu günceller.

Transact-SQL söz dizimi kuralları

Syntax

[ WAITFOR ( ]  
    RECEIVE [ TOP ( n ) ]   
        <column_specifier> [ ,...n ]  
        FROM <queue>  
        [ INTO table_variable ]  
        [ WHERE {  conversation_handle = conversation_handle  
                 | conversation_group_id = conversation_group_id } ]  
[ ) ] [ , TIMEOUT timeout ]  
[ ; ]  
  
<column_specifier> ::=  
{    *   
  |  { column_name | [ ] expression } [ [ AS ] column_alias ]  
}     [ ,...n ]   
  
<queue> ::=  
{ database_name.schema_name.queue_name | schema_name.queue_name | queue_name }

Arguments

WAITFOR

Şu anda hiç mesaj yoksa, ilanın RECEIVE kuyruğun içine bir mesaj gelmesini beklediğini belirtir.

TOP( n )

Geri dönecek maksimum mesaj sayısını belirtir. Bu madde belirtilmemişse, ifade kriterlerini karşılayan tüm mesajlar geri gönderilir.

column_specifier

*
Sonuç kümesinin kuyruktaki tüm sütunları içerdiğini belirtir.

column_name
Sonuç kümesine dahil edilecek bir sütunun adı.

expression
Bir sütun adı, sabit, fonksiyon veya operatörle bağlantılı herhangi bir sütun isimleri, sabitleri ve fonksiyonların kombinasyonu.

column_alias
Sonuç kümesinde sütun adının yerine alternatif bir isim.

FROM

Alınacak mesajları içeren kuyruk belirtilir.

database_name
Mesaj alınacak kuyruğu içeren veritabanının adı. Veritabanı adı verilmediğinde, mevcut veritabanı varsayılan olarak kullanılır.

schema_name
Mesaj almak için kuyruğu alan şemanın adı. Şema adı verilmediğinde, mevcut kullanıcı için varsayılan şema tercih edilir.

queue_name
Mesaj alınacak kuyruğun adı.

INTO table_variable

Mesajları yerleştiren tablo değişkenini RECEIVE belirtir. Tablo değişkeninin mesajlarda bulunan sütun sayısına sahip olması gerekir. Tablo değişkenindeki her sütunun veri tipi, mesajlardaki ilgili sütunun veri tipine örtük olarak dönüştürülebilir olmalıdır. INTO belirtilmemişse, mesajlar sonuç kümesi olarak döner.

WHERE

Alınan mesajlar için konuşma veya sohbet grubunu belirtir. Eğer atlanırsa, bir sonraki mevcut konuşma grubundan mesajlar döner.

conversation_handle = conversation_handle
Alınan mesajlar için konuşmayı belirtir. Sağlanan konuşma adı bir uniqueidentifier veya uniqueidentifier'a dönüştürülebilen bir tür olmalıdır.

conversation_group_id = conversation_group_id
Alınan mesajlar için konuşma grubunu belirtir. Sağlanan konuşma grubu kimliği , bir uniqueidentifier veya uniqueidentifier'a dönüştürülebilir bir tür olmalıdır.

MOLA VERME

Bir mesajı bekleme süresini, milisaniye cinsinden belirtir. Bu madde yalnızca WAITFOR maddesiyle kullanılabilir. Bu madde belirtilmemişse veya zaman aşımı -1, bekleme süresi sınırsızdır. Zaman aşımı dönerse, RECEIVE boş bir sonuç kümesi döner.

Remarks

Important

Eğer ifade, RECEIVE bir toplu veya saklanan prosedürün ilk ifadesi değilse, önceki ifadenin noktalı virgül (;)) ile sonlandırılması gerekir.

Bu ifade RECEIVE bir kuyruktan mesajları okur ve bir sonuç kümesi döndürür. Sonuç kümesi, her biri bir mesaj içeren sıfır veya daha fazla satırdan oluşur. INTO cümlesi kullanılmazsa ve column_specifier değerleri yerel değişkenlere atamıyorsa, ifade, çağıran programa bir sonuç kümesi döndürür.

Ifadenin RECEIVE geri dönen mesajları farklı mesaj türlerinde olabilir. Uygulamalar, her mesajı ilgili mesaj tipini işleyen koda yönlendirmek için sütunu message_type_name kullanabilir. İki mesaj türü sınıfı vardır:

  • Uygulama tarafından tanımlanan mesaj türleri, bu CREATE MESSAGE TYPE ibetle oluşturulmuştur. Bir konuşmada izin verilen uygulama tanımlı mesaj türleri kümesi, konuşma için belirlenen Hizmet Brokerı sözleşmesi tarafından tanımlanır.

  • Service Broker sistem mesajları ile durum veya hata bilgisi döndürür.

Bu ifade RECEIVE , kuyruk mesaj tutma belirtmedikçe alınan mesajları kuyruğun içinden kaldırır. Kuyruk için SAKLAMA ayarı AÇIKSA, ifade RECEIVEstatus sütunu günceller 0 ve mesajları kuyruk içinde bırakır. Bir RECEIVE ifade içeren işlem geri alındığında, işlemdeki kuyruk üzerindeki tüm değişiklikler de geri alınır ve mesajlar kuyruğun içine geri döner.

Bir RECEIVE ifadeyle geri dönen tüm mesajlar aynı konuşma grubuna aittir. Bu ifade RECEIVE , ifadeyi içeren işlem tamamlanana kadar geri dönen mesajlar için konuşma grubunu kilitler. Bir ifade, RECEIVE 'den bir status1mesaj döndürür. Bir RECEIVE ifadeyle döndürülen sonuç kümesi örtük olarak sıralanır:

  • Birden fazla konuşmadan gelen mesajlar WHERE maddesi koşullarını karşılarsa, ifade RECEIVE bir konuşmadan gelen tüm mesajları döndürür, sonra diğer herhangi bir konuşma için mesaj döndürür. Konuşmalar öncelik seviyesi sırasına göre azalan şekilde işleniyor.

  • Belirli bir konuşma için, bir RECEIVE ifade mesajları artan message_sequence_number sırayla döndürür.

Cümledeki RECEIVE WHERE cümlesi yalnızca bir arama koşulu içerebilir ve bu koşul herhangi birini conversation_handle veya conversation_group_id'i kullanabilir. Arama koşulu, kuyruktaki diğer sütunlardan birini veya birkaçını içeremez. Ya conversation_group_id da conversation_handle bir ifade olamaz. Geri dönen mesaj kümesi, WHERE maddesinde belirtilen koşullara bağlıdır:

  • Eğer conversation_handle belirtilirse, RECEIVE kuyruk içinde mevcut olan belirtilen konuşmadan gelen tüm mesajları döndürür.

  • Eğer conversation_group_id belirtilmişse, RECEIVE belirtilen konuşma grubunun herhangi bir üyesinden kuyruk içinde mevcut olan tüm mesajları döndürür.

  • WHERE cümlesi yoksa, RECEIVE hangi konuşma grubu olduğunu belirler:

    • Kuyruğunda bir veya daha fazla mesaj var.

    • Başka RECEIVE bir açıklama tarafından kilitlenmedi.

    • Bu kriterleri karşılayan tüm konuşma grupları arasında en yüksek öncelik seviyesine sahiptir.

    RECEIVE Ardından, seçilen konuşma grubunun herhangi bir üyesi olan herhangi bir konuşmadan kuyruk içindeki tüm mesajları döndürür.

WHERE cümlesinde belirtilen konuşma tutucusu veya konuşma grubu tanımlayıcısı mevcut değilse veya belirtilen kuyruk ile ilişkilendirilmiyorsa, ifade RECEIVE hata döndürür.

Eğer ifadede RECEIVE belirtilen kuyruk durumu OFF olarak ayarlanmışsa, ifade Transact-SQL hatasıyla başarısız olur.

WAITFOR maddesi belirtildiğinde, ifade belirtilen zaman aşımına veya bir sonuç kümesi bulunana kadar bekler. Eğer kuyruk düşürülürse veya deyimin durumu beklenirken KAPALI olarak ayarlanırsa, ifade hemen hata döndürür. Eğer ifade RECEIVE bir konuşma grubu veya konuşma adresi belirtirse ve o konuşma hizmeti bırakılırsa veya başka bir kuyruğun içine taşınırsa, ifade RECEIVE Transact-SQL hatası bildirir.

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

Açıklamanın RECEIVE açlıktan önlenmesi önceliği yoktur. Tek RECEIVE bir ifade bir konuşma grubunu kilitliyor ve düşük öncelikli konuşmalardan çok sayıda mesaj alıyorsa, gruptaki yüksek öncelikli konuşmalardan mesaj alınamaz. Bunu önlemek için, düşük öncelikli konuşmalardan mesaj alırken, her RECEIVE ifadenin alınan mesaj sayısını sınırlamak için TOP maddesini kullanın.

Kuyruk Sütunları

Aşağıdaki tablo kuyruktaki sütunları listeler:

Sütun adı Veri türü Description
status tinyint İletinin durumu. Komutla geri dönen RECEIVE mesajlar için durum her 0zaman 'dir. Kuyruk içindeki mesajlar aşağıdaki değerlerden birini içerebilir:

0=Hazır
1=Alınan mesaj
2=Henüz tamamlanmadı
3=Gönderilen mesajı tutuldu
priority tinyint Mesaja uygulanan konuşma öncelik seviyesi.
queuing_order bigint Kuyruk içindeki mesaj sipariş numarası.
conversation_group_id uniqueidentifier Bu mesajın ait olduğu konuşma grubunun tanımlayıcısı.
conversation_handle uniqueidentifier Bu mesajın parçası olduğu konuşma için kullanıcı adı.
message_sequence_number bigint Konuşmadaki mesajın sıra numarası.
service_name nvarchar(128) Konuşmanın yapılacağı hizmetin adı.
service_id int Konuşmanın yapıldığı hizmetin SQL Server nesne tanımlayıcısı.
service_contract_name nvarchar(128) Konuşmanın takip ettiği sözleşmenin adı.
service_contract_id int Konuşmanın takip ettiği sözleşmenin SQL Server nesne tanımlayıcısı.
message_type_name nvarchar(128) Mesajın formatını tanımlayan mesaj türünün adı. Mesajlar uygulama mesajı tipleri veya Broker sistem mesajları olabilir.
message_type_id int Mesajı tanımlayan mesaj tipine ait SQL Server nesne tanımlayıcısı.
validation nchar(2) Mesaj için kullanılan doğrulama.

E=Boş
N=Yok
X=XML
message_body varbinary(MAX) İletinin içeriği.

Permissions

Bir mesaj almak için mevcut kullanıcının kuyruk üzerinde iznine sahip RECEIVE olması gerekir.

Examples

A. Bir konuşma grubundaki tüm mesajlar için tüm sütunları alın

Aşağıdaki örnek, sıradaki mevcut konuşma grubu ExpenseQueue için kuyruktan tüm mevcut mesajları alır. Bu ifade mesajları sonuç kümesi olarak döndürür.

RECEIVE * FROM ExpenseQueue ;  

B. Bir konuşma grubundaki tüm mesajlar için belirlenen sütunları alın

Aşağıdaki örnek, sıradaki mevcut konuşma grubu ExpenseQueue için kuyruktan tüm mevcut mesajları alır. Bu ifade, mesajları sütunları içeren bir sonuç kümesi conversation_handleolarak döndürür message_type_name, , ve message_body.

RECEIVE conversation_handle, message_type_name, message_body  
FROM ExpenseQueue ;  

C. Kuyruğun ilk mevcut mesajını alın

Aşağıdaki örnek, kuyruktan ilk mevcut mesajı ExpenseQueue bir sonuç kümesi olarak alır.

RECEIVE TOP (1) * FROM ExpenseQueue ;  

D. Belirli bir konuşma için tüm mesajları alın

Aşağıdaki örnek, belirlenen konuşma ExpenseQueue için kuyruk için mevcut tüm mesajları bir sonuç kümesi olarak alır.

DECLARE @conversation_handle UNIQUEIDENTIFIER ;  
  
SET @conversation_handle = <retrieve conversation from database> ;  
  
RECEIVE *  
FROM ExpenseQueue  
WHERE conversation_handle = @conversation_handle ;  

E. Belirli bir konuşma grubu için mesaj alın

Aşağıdaki örnek, belirlenen konuşma grubu ExpenseQueue için kuyruk için mevcut tüm mesajları bir sonuç kümesi olarak alır.

DECLARE @conversation_group_id UNIQUEIDENTIFIER ;  
  
SET @conversation_group_id =   
    <retrieve conversation group ID from database> ;  
  
RECEIVE *  
FROM ExpenseQueue  
WHERE conversation_group_id = @conversation_group_id ;  

F. Bir tablo değişkenine alın

Aşağıdaki örnek, belirli bir konuşma grubu için mevcut tüm mesajları kuyraktan ExpenseQueue bir tablo değişkenine alır.

DECLARE @conversation_group_id UNIQUEIDENTIFIER ;  
  
DECLARE @procTable TABLE(  
     service_instance_id UNIQUEIDENTIFIER,  
     handle UNIQUEIDENTIFIER,  
     message_sequence_number BIGINT,  
     service_name NVARCHAR(512),  
     service_contract_name NVARCHAR(256),  
     message_type_name NVARCHAR(256),  
     validation NCHAR,  
     message_body VARBINARY(MAX)) ;  
  
SET @conversation_group_id = <retrieve conversation group ID from database> ;  
  
RECEIVE TOP (1)  
    conversation_group_id,  
    conversation_handle,  
    message_sequence_number,  
    service_name,  
    service_contract_name,  
    message_type_name,  
    validation,  
    message_body  
FROM ExpenseQueue  
INTO @procTable  
WHERE conversation_group_id = @conversation_group_id ;  

G. Mesaj almak ve süresiz beklemek

Aşağıdaki örnek, kuyruktaki ExpenseQueue bir sonraki mevcut konuşma grubu için tüm mevcut mesajları alır. Bu ifade en az bir mesaj kullanılabilir olana kadar bekler, ardından tüm mesaj sütunlarını içeren bir sonuç kümesi döndürür.

WAITFOR (  
    RECEIVE *  
    FROM ExpenseQueue) ;  

H. Mesaj alın ve belirli bir aralık için beklen.

Aşağıdaki örnek, kuyruktaki ExpenseQueue bir sonraki mevcut konuşma grubu için tüm mevcut mesajları alır. Bu ifade 60 saniye veya en az bir mesaj kullanılabilir olana kadar bekler; hangisi önce gelirse. Bu ifade, en az bir mesaj mevcutsa tüm mesaj sütunlarını içeren bir sonuç kümesi döndürür. Aksi takdirde, ifade boş bir sonuç kümesi döndürür.

WAITFOR (  
    RECEIVE *  
    FROM ExpenseQueue ),  
TIMEOUT 60000 ;  

I. Mesaj alın, sütunun türünü değiştirin

Aşağıdaki örnek, kuyruktaki ExpenseQueue bir sonraki mevcut konuşma grubu için tüm mevcut mesajları alır. Mesaj türü mesajın bir XML belgesi içerdiğini belirttiğinde, ifade mesaj gövdesini XML'e dönüştürür.

WAITFOR (  
    RECEIVE message_type_name,  
        CASE  
            WHEN validation = 'X' THEN CAST(message_body as XML)  
            ELSE NULL  
         END AS message_body   
         FROM ExpenseQueue ),  
TIMEOUT 60000 ;  

J. Mesaj alın, mesaj gövdesinden veri çıkarılır, konuşma durumunu alın

Aşağıdaki örnek, kuyruğun bir sonraki mevcut konuşma grubu ExpenseQueue için bir sonraki mevcut mesajı alır. Mesaj türünde //Adventure-Works.com/Expenses/SubmitExpense, ifade çalışan kimliğini ve mesaj gövdesinden bir madde listesini çıkarır. Bu ifade ayrıca masadan konuşma ConversationState için durumu da alır.

WAITFOR(  
    RECEIVE   
    TOP(1)  
      message_type_name,  
      COALESCE(  
           (SELECT TOP(1) ConversationState  
            FROM CurrentConversations AS cc  
            WHERE cc.ConversationHandle = conversation_handle),  
           'NEW')  
      AS ConversationState,  
      COALESCE(  
          (SELECT TOP(1) ErrorCount  
           FROM CurrentConversations AS cc  
           WHERE cc.ConversationHandle = conversation_handle),   
           0)  
      AS ConversationErrors,  
      CASE WHEN message_type_name = N'//Adventure-Works.com/Expenses/SubmitExpense'  
          THEN CAST(message_body AS XML).value(  
                'declare namespace rpt = "https://Adventure-Works.com/schemas/expenseReport"  
                   (/rpt:ExpenseReport/rpt:EmployeeID)[1]', 'nvarchar(20)')  
         ELSE NULL  
      END AS EmployeeID,  
      CASE WHEN message_type_name = N'//Adventure-Works.com/Expenses/SubmitExpense'  
          THEN CAST(message_body AS XML).query(  
                'declare namespace rpt = "https://Adventure-Works.com/schemas/expenseReport"   
                     /rpt:ExpenseReport/rpt:ItemDetail')  
          ELSE NULL  
      END AS ItemList  
    FROM ExpenseQueue   
), TIMEOUT 60000 ;