Aracılığıyla paylaş


(Transact-SQL) RECEIVE

Sıradan bir veya daha fazla ileti alır.Koruma ayarını sıra için bağlı ya da iletiyi sıradan kaldırır veya ileti sırasındaki durumunu güncelleştirir.

Topic link iconTransact-SQL sözdizimi kuralları

[ 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 ]
  |  column_alias = expression 
}     [ ,...n ] 

<queue> ::=
{
    [ database_name . [ schema_name ] . | schema_name . ]
        queue_name
}

Bağımsız değişkenler

  • waitfor
    İleti şu anda varsa Al deyim sıranın geldiğinde bir ileti bekler olduğunu belirtir.

  • TOP(n)
    Döndürülen iletilerin sayısı belirler.Bu yan belirtilirse, tüm iletiler, deyim ölçütlerine döndürülür.

  • *
    Belirleyen bir sonuç küme sırasındaki tüm sütunlar içerir.

  • column_name
    Sonucu eklemek için sütun adını küme.

  • expression
    Bir sütun adı, sabit, işlev veya sütun adları, sabitler ve işlevlerini bir işleciyle bağlanmış herhangi bir birleşimi.

  • column_alias
    Sonuç kümesinde sütun adını değiştirmek için bir diğer ad.

  • Kimden
    İletileri almak için içeren sırasını belirtir.

  • database_name
    Gelen iletileri almak için sıra içeren veritabanının adı.Yok, database name , geçerli veritabanı için varsayılan değerler verilmiştir.

  • schema_name
    Gelen iletileri almak için sıraya sahip olan şema adı.Yok, schema name , varsayılan olarak geçerli kullanıcının varsayılan şemayı sağlanır.

  • queue_name
    Gelen ileti sırasının adı.

  • table_variable
    Al iletileri içine yerleştirilen tablo değişkeni belirtir.Tablo değişkeni iletileri gibi sütun sayısı aynı olmalıdır.Her sütunda tablo değişkeni veri türü, iletileri ilgili sütun veri türüne örtük olarak dönüştürülebilir olmalıdır.INTO belirtilmediği takdirde, iletiler sonuç olarak döndürülen küme.

  • BURADA
    Görüşme belirtir veya konuşma grubu alınan iletiler.Atlanırsa, sonraki iletileri döndürüyor kullanılabilir konuşma grubu.

  • conversation_handle = conversation_handle
    Alınan iletiler için konuşma belirtir.The conversation handle provided must be a uniqueidentifer, or a type that is convertible to uniqueidentifier.

  • conversation_group_id = conversation_group_id
    Belirtir konuşma grubu alınan iletiler.The conversation group ID that is provided must be a uniqueidentifier, or a type convertible to uniqueidentifier.

  • timeout TIMEOUT
    saat (milisaniye olarak belirtir deyim bir ileti beklemesi için.Bu yan tümce ile bekle kullanılması yan tümce.Bu yan tümce belirtilmemiş, ya da saat aşımı iş -1, bekleme saat sınırsızdır.saat aşımı saat dolarsa, Al bir boş sonuç döndüren küme.

Remarks

Important noteImportant Note:

İlk deyim, toplu iş iş iş veya saklı yordam Al deyim değilse, yukarıdaki deyim noktalı virgülle (;) ile sona erdi gerekir.

Al deyim, sıradan ileti okuyan ve bir sonuç döndüreceği küme.Sonuç küme sıfır veya daha fazla satır her biri içeren bir ileti içerir.INTO yan kullanılıyorsa vecolumn_specifierdeğerler atama yerel değişkenler için deyim bir sonuç döndüreceği için küme arama programı.

Al deyim ile döndürülen iletilerin farklı ileti türleri olabilir.Uygulamaları kullanarakmessage_type_name sütun, ilişkili ileti türü. işleyen kod ileti yönlendirmek için İki sınıf ileti türleri vardır:

  • CREATE ileti türü deyim kullanılarak oluşturulan uygulama tanımlı ileti türleri.küme Uygulama tanımlı ileti konuşma izin verilen tür tarafından tanımlananService Brokeranlaşma, belirtilen konuşma.

  • Service Broker Döndürülen durum veya hata bilgileri sistem iletileri.Daha fazla bilgi için bkz: Sistem iletilerini Aracısı.

Sıranın ileti saklama belirtmediği sürece Al deyim sıradan alınan iletilerin kaldırır., SAKLAMA sıra ayarıdır ON Al deyim güncelleştirmeleridurumu0 ve yapraklar iletileri sıraya. sütun Bir Al içeren bir hareket, deyim yeniden tüm geldiğinde yapılan işlem sırasına de toplu yeniden sıraya iletiler döndürmek.

Al deyim ile döndürülen tüm iletilerin aynı konuşma grubuna aittir.Al deyim deyim içeren işlem bitene kadar döndürülen iletilerin konuşma grubu kilitler.A RECEIVE deyim döndürür olan iletiler birdurumu of 1. Al deyim tarafından döndürülen sonuç kümesinden dolaylı olarak sipariş edilen:

  • İletileri birden fazla görüşme WHERE yan tümce koşulları karşılayan, Al deyim, başka bir konuşma için iletileri döndürüyor önce bir konuşma tüm iletileri döndürür.Görüşmeleri, azalan öncelik düzey sırada işlenir.

  • Bir Al belirli bir konuşma için deyim artan iletileri döndürüyormessage_sequence_number order.

The WHERE yan tümce Al ifadesinin yalnızca ya da kullanan bir arama koşulu içerenconversation_handle veya conversation_group_id . Arama koşulu veya birden fazlasını sıra diğer sütun içeremez.The conversation_handle or conversation_group_id cannot be an expression.küme ileti döndürülür, WHERE yan tümcesinde belirtilen koşullara bağlıdır:

  • Ifconversation_handle belirtilirse, tüm iletileri Al kuyruğu. içinde bulunan belirli konuşma verir

  • Ifconversation_group_id belirtilirse, belirtilen konuşma grubu. üyesi olan bir konuşma sıradan bulunan tüm iletileri Al verir

  • Herhangi bir WHERE yan tümce varsa, hangi Al belirler konuşma grubu:

    • Bir veya daha fazla ileti sıraya sahiptir.

    • Başka bir Al deyim tarafından kilitlenmiş değil.

    • Bu ölçütlere uyan tüm konuşma grupları en yüksek öncelik düzey vardır.

    Al seçili üyesi olan bir konuşma daha sonra sırada kullanılabilir olan tüm iletileri verir konuşma grubu.

WHERE yan tümce veya belirtilen sıra ile ilişkili olmayan belirtilen tanımlayıcı konuşma tanıtıcısı veya konuşma grubu, Al deyim hata verir.

İle deyim Al deyiminde belirtilen sıra sıra durumu Kapalı olarak küme, başarısız birTransact-SQLhatası.

WAITFOR yan belirtildiğinde, belirtilen saat aşımı veya kadar bir sonuç deyim bekler küme kullanılabilir.Sıra kesilmeden veya deyim beklediği sırada kapalı sıra durumunu küme, deyim, hemen bir hata döndürür.Bir konuşma grubu veya konuşma tanıtıcısı ve hizmet Al deyim bu konuşmaya bırakılan veya başka bir kuyruğa taşınmasını belirtir, Al deyim bildirir birTransact-SQLhatası.

Al, bir kullanıcı tanımlı işlev geçerli değil.

Hiçbir öncelik starvation önlem Al deyim vardır.Tek bir Al deyim bir konuşma grubu kilitler ve düşük öncelikli görüşmeler çok sayıda ileti alır, ileti grubunun yüksek öncelikli görüşmeleri alınan.Düşük öncelikli görüşmeleri iletileri alırken Bunu önlemek için her Al deyim tarafından alınan iletilerin sayısını sınırlamak için TOP yan tümce kullanın.

Sıra sütunlar

Bir sıra sütunlar aşağıdaki tabloda listelenmektedir:

sütun Name

Veri türü

Açıklama

Durum

tinyint

İleti durumu.Al komutu tarafından döndürülen iletilerin durumunda her zaman0.Sıradaki iletileri aşağıdaki değerlerden birini içerebilir:

0=Hazır1=İleti alındı2=Henüz tamamlanmadı3=Gönderilen ileti saklandı

Öncelik

tinyint

İletiye uygulanan konuşma öncelik düzey.

queuing_order

bigint

Sırasındaki ileti sipariş numarası.

conversation_group_id

uniqueidentifier

Tanımlayıcı konuşma grubu bu iletiye ait olduğu.

conversation_handle

uniqueidentifier

Bu iletinin parçası olan konuşma için işler.

message_sequence_number

bigint

Görüşme iletinin sıra numarası.

HİZMET_ADI

nvarchar(512)

Görüşme için hizmet adı.

service_id

int

SQL Server Nesne tanımlayıcısı, görüşme hizmet.

service_contract_name

nvarchar(256)

Görüşmeyi izleyen anlaşma adı.

service_contract_id

int

SQL Server Görüşmeyi izleyen sözleşmenin nesne tanımlayıcısı.

message_type_name

nvarchar(256)

İleti biçimini tanımlayan ileti türünün adıdır.İletileri uygulama ileti türleri ya da sistem iletilerini aracı olabilir.

message_type_id

int

SQL Server ileti türü, iletiyi tanımlayan nesne tanımlayıcısı.

doğrulama

nchar(2)

İleti için kullanılacak doğrulama.

E=EmptyN=NoneX=XML

message_body

varbinary(MAX)

İleti içeriği.

İzinler

Bir ileti almak için geçerli kullanıcı sıraya al izninizin olması gerekir.

Örnekler

C.Tüm iletiler için tüm sütunları almaya bir konuşma grubu

Sonraki kullanılabilir tüm iletileri aşağıdaki örnek alan kullanılabilir konuşma grubu gelenExpenseQueuesıra.İletileri deyim verir, dolayısıyla küme.

RECEIVE * FROM ExpenseQueue ;

b.Tüm iletiler için belirtilen sütun alan bir konuşma grubu

Sonraki kullanılabilir tüm iletileri aşağıdaki örnek alan kullanılabilir konuşma grubu gelenExpenseQueuesıra.İletileri ifade verir, dolayısıyla küme sütunları içerenconversation_handle,message_type_name, vemessage_body.

RECEIVE conversation_handle, message_type_name, message_body
FROM ExpenseQueue ;

c.Kullanılabilir ilk ileti sıraya alma

Aşağıdaki örnekte ilk kullanılabilir iletisinden alanExpenseQueueSonuç olarak sıra küme.

RECEIVE TOP (1) * FROM ExpenseQueue ;

d.Belirli bir konuşma için tüm iletileri alma

Belirtilen bir konuşma için tüm kullanılabilir iletiler aşağıdaki örnek alanExpenseQueueSonuç olarak sıra küme.

DECLARE @conversation_handle UNIQUEIDENTIFIER ;

SET @conversation_handle = <retrieve conversation from database> ;

RECEIVE *
FROM ExpenseQueue
WHERE conversation_handle = @conversation_handle ;

e.Belirtilen konuşma grubu iletileri alma

Aşağıdaki örnekte tüm kullanılabilir iletiler için belirtilen alan konuşma grubu gelenExpenseQueueSonuç olarak sıraya kümesi.

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şkeni alma

Aşağıdaki örnekte tüm kullanılabilir iletiler için belirtilen alan konuşma grubu gelenExpenseQueuesıraya bir tablo değişkeni.

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.İleti alma ve sonsuza kadar bekliyor

Aşağıdaki örnek bir sonraki kullanılabilir konuşma grubunda kullanılabilir tüm iletileri alanExpenseQueuesıra.En az bir ileti kullanılabilir sonra bir sonuç döndüren deyim bekler küme, tüm ileti sütunlarını içerir.

WAITFOR (
    RECEIVE *
    FROM ExpenseQueue) ;

h.İleti alma ve belirli bir süre için bekliyor

Aşağıdaki örnek bir sonraki kullanılabilir konuşma grubunda kullanılabilir tüm iletileri alanExpenseQueuesıra.deyim Hangisi ilk 60 saniye ve en az bir ileti kullanılabilir oluncaya kadar olursa için bekler.İfade bir sonuç döndüreceği için küme tüm ileti sütunlarını içeren en az bir ileti olup olmadığını.Aksi halde, deyim boş bir sonuç döndürür küme.

WAITFOR (
    RECEIVE *
    FROM ExpenseQueue ),
TIMEOUT 60000 ;

İ.sütun türünü değiştirmek, alma

Aşağıdaki örnek bir sonraki kullanılabilir konuşma grubunda kullanılabilir tüm iletileri alanExpenseQueuesıra.İletiyi bir XML belgesi içeren ileti türünü belirten, deyim ileti gövdesi XML biçimine 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.Konuşma durum alma ileti gövdesinden verileri ayıklama ileti alma

Aşağıdaki örnek bir sonraki kullanılabilir konuşma grubu için kullanılabilir bir sonraki iletiye alanExpenseQueuesıra.Zaman türü olan iletiyi//Adventure-Works.com/Expenses/SubmitExpensedeyim, çalışan kimliği ve ileti gövdesi. öğelerin listesini ayıklardeyim de görüşme durumunu alırConversationStateTablo.

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 = "http://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 = "http://Adventure-Works.com/schemas/expenseReport" 
                     /rpt:ExpenseReport/rpt:ItemDetail')
          ELSE NULL
      END AS ItemList
    FROM ExpenseQueue 
), TIMEOUT 60000 ;