Aracılığıyla paylaş


ALMA (Transact-SQL)

Bir veya daha fazla ileti sıradan alır.Sıra için saklama ayarı, bağlı ya da iletiyi sıradan kaldırır veya sıraya ileti durumunu güncelleştirir.

Konu bağlantısı simgesiTransact-SQL sözdizimi kuralları

Sözdizimi

[ 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
    Hiçbir ileti şu anda varsa, deyim alma sırası geldiğinde bir ileti bekler olduğunu belirtir.

  • TOP( n )
    Döndürülecek iletileri en fazla sayısını belirtir.Bu yan tümce belirtilmezse deyim ölçütlere uyan tüm iletiler döndürülür.

  • *
    sonuç kümesi sıradaki tüm sütunlar içerdiğini belirtir.

  • column_name
    sonuç kümesidahil etmek için bir sütun adı.

  • expression
    Bir sütun adı, sabit, işlevveya sütun adları, sabitleri ve işlevleri tarafından bir işleçbağlı herhangi bir birleşimi.

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

  • DAN
    Almak için iletileri içeren sıra belirtir.

  • database_name
    İleti almak için sıra içeren veritabanının adı.Hayır, database name sağlanan, varsayılan olarak geçerli veritabanı.

  • schema_name
    İleti almak için sıranın sahibi şema adı.Hayır, schema name sağlanan, varsayılan olarak varsayılan şeması için geçerli bir kullanıcı.

  • queue_name
    İleti almak sırasının adı.

  • İÇİNEtable_variable
    İletilere alma yerleştirir tablo değişkeni belirtir.tablo değişkeni iletileri gibi sütun sayısı aynı olması gerekir.tablo değişkeni her sütun veri türünü iletileri karşılık gelen sütun veri türüne örtük olarak dönüştürülebilir olmalıdır.INTO belirtilmezse, iletileri bir sonuç kümesiolarak döndürülür.

  • BURADA
    Konuşma veya alınan iletilerin konuşma grubu belirtir.Atlanırsa, sonraki kullanılabilir konuşma grubuiletileri döndürüyor.

  • conversation_handle =conversation_handle
    Alınan iletilerin görüşme belirtir.conversation handle Gereken sağlanan olması bir uniqueidentifer, ya da için dönüştürülebilir bir türü uniqueidentifier.

  • conversation_group_id =conversation_group_id
    Alınan iletilerin konuşma grubu belirtir.conversation group ID that is Gereken sağlanan olması bir uniqueidentifier, ya da bir tür dönüştürülebilir uniqueidentifier.

  • ZAMAN AŞIMItimeout
    saat, bir ileti beklemesi deyim için milisaniye cinsinden belirtir.Bu yan tümce yalnızca WAITFOR yan tümceile kullanılamaz.Bu yan tümce belirtilmezse veya saat- mı -1, bekleme saat sınırsızdır.saat-çıkış süresi, alma işlevi bir boş sonuç kümesi.

Açıklamalar

Önemli notÖnemli

Al deyim ilk deyim bir toplu iş veya saklı yordam, değilse, önceki deyim bir noktalı virgülle bitmesi gereken (;).

Al deyim bir sıradan iletileri okur ve bir sonuç kümesidöndürür.sonuç kümesi , her biri tek bir ileti içeren sıfır veya daha çok sayıda, oluşur.INTO yan tümce kullanılmazsa, ve column_specifier değerleri atamaz yerel değişkenler için deyim bir sonuç kümesi çağıran program döndürür.

Al deyim tarafından döndürülen iletileri farklı ileti türleri olabilir.Uygulamaları kullanarak message_type_name sütun yol ileti türüilişkili her iletinin kodunu işler.İki sınıf ileti türleri vardır:

  • create message type deyimkullanılarak oluşturulan uygulama tanımlı ileti türleri.küme , konuşmada izin verilen uygulama tanımlı ileti türleri tarafından tanımlanmıştır Service Brokeranlaşma için belirtilen görüşme.

  • Service BrokerDönüş bu durum veya hata bilgileri sistem iletileri.Daha fazla bilgi için, bkz. Broker sistem iletileri.

Sıranın ileti saklama belirtmediği sürece Al deyim alınan iletilerin sıradan kaldırır.Sıra için SAKLAMA ayarı on, Al deyim güncelleştirmeler olduğunda Durum sütun 0 ve kuyruktaki iletileri bırakır.Al deyim içeren bir hareketi geri geldiğinde, işlem sırasındaki tüm değişiklikleri de geri, sıra iletilerini döndüren alınır.

Al deyim tarafından döndürülen tüm iletilerin aynı konuşma grubuait.deyim alma deyim içeren işlem bitene kadar döndürülen iletilerin konuşma grubu kilitler.İletileri Al deyim döndürür bir Durum , 1. Al deyim tarafından döndürülen sonuç kümesi örtülü olarak sıralanmıştır:

  • Birden çok görüşmeleri iletilerden where yan tümce koşulları karşılıyorsa Al deyim herhangi bir görüşme için iletileri döndürüyor önce bir konuşma tüm iletiler döndürür.Konuşma öncelik düzey azalan sırada işlenir.

  • Belirli bir konuşma için artan iletileri Al deyim döndürür message_sequence_number sipariş.

Al deyim where yan tümce yalnızca ya da kullanan bir arama koşulu içerebilir conversation_handle veya conversation_group_id.Bir veya daha fazlasını sıra diğer sütunlarda arama koşulu içeremez.Conversation_handle veya conversation_group_id bir ifadeolamaz.Döndürülen küme , iletileri, where yan tümcetümcesinde belirtilen koşullara bağlıdır:

  • Conversation_handle belirtilmişse, alma sırasındaki kullanılabilir belirtilen konuşma gelen tüm iletileri döndürüyor.

  • Conversation_group_id belirtilirse, belirtilen konuşma grubu üye olan herhangi bir görüşmeyi sıradan kullanılabilir tüm iletileri alma verir.

  • Hiçbir where yan tümcevarsa, Al konuşma grububelirler:

    • Bir veya daha fazla ileti sırasına sahiptir.

    • Başka bir Al deyimtarafından kilitli değil.

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

    Sonra döndürür seçili konuşma grubu üye olan herhangi bir görüşmeyi tüm iletileri sırada kullanılabilir alırsınız.

Al deyim , where yan tümce tümcesinde belirlenen konuşma tanıtıcısı veya konuşma grubu tanımlayıcısı yok veya belirtilen sıra ile değil, bir hata döndürür.

Al deyim içinde belirtilen sıra sıra durumunu küme off varsa, deyim ile başarısız bir Transact-SQL hata.

WAITFOR yan tümce belirtildiğinde, deyim belirtilen saat için veya bir sonuç kümesi kullanılabilir duruma gelene kadar bekler.Sıra bırakılan veya deyim beklediği sırada sırasının durumunu küme için off deyim hemen bir hata döndürür.konuşma grubu veya konuşma tanıtıcısı alma deyim belirtir ve bu görüşme için hizmet bırakılan veya başka bir sıraya taşındı, Al deyim bildiriyor bir Transact-SQL hata.

Alma kullanıcı tanımlı bir işleviçinde geçerli değil.

Hiçbir öncelik sorunlar önlem alma deyim vardır.Tek bir alma deyim konuşma grubu kilitler ve düşük öncelikli konuşma arasındaki çok ileti alır, yüksek öncelikli görüşmeleri grubunda hiçbir ileti alınabilirler.Düşük öncelikli konuşma arasındaki iletileri alırken Bunu önlemek için her Al deyimtarafından alınan iletilerin sayısını sınırlamak için üst yan tümce kullanın.

Sıra sütunlar

Aşağıdaki tablo , bir sıra içindeki sütunları listeler:

Sütun adı

Veri türü

Açıklama

Durum

tinyint

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

0Hazır =1alınan ileti =2henüz tam = değil3= Retained gönderilen ileti

Öncelik

tinyint

İleti için uygulanan konuşma öncelik düzey .

queuing_order

bigint

Sırasındaki ileti sipariş numarası.

conversation_group_id

uniqueidentifier

Bu iletiye ait olduğu konuşma grubu tanımlayıcısı.

conversation_handle

uniqueidentifier

Bu ileti parçası olan konuşma işleci.

message_sequence_number

bigint

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

HİZMET_ADI

nvarchar(512)

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

service_id

int

SQL Servergörüşme için hizmet nesne tanımlayıcısı.

service_contract_name

nvarchar(256)

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

service_contract_id

int

SQL ServerGörüşme izleyen anlaşma nesne tanımlayıcısı.

message_type_name

nvarchar(256)

İletinin biçimini tanımlayan ileti türü adı.İletileri uygulama ileti türleri veya Broker sistem iletilerini olabilir.

message_type_id

int

SQL Serveriletiyi tanımlayan ileti türü tanımlayıcısı nesne.

Doğrulama

nchar(2)

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

E=EmptyN=NoneX=XML

message_body

varbinary(MAX)

İletinin içeriği.

İzinler

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

Örnekler

A.konuşma grubuiçindeki tüm iletiler için tüm sütunları alma

Aşağıdaki örnek bir sonraki kullanılabilir konuşma grubu için tüm kullanılabilir iletilerini alır ExpenseQueue sıra.deyim iletileri bir sonuç kümesiolarak döndürür.

RECEIVE * FROM ExpenseQueue ;

B.konuşma grubutüm iletiler için alıcı belirtilen sütunlar

Aşağıdaki örnek bir sonraki kullanılabilir konuşma grubu için tüm kullanılabilir iletilerini alır ExpenseQueue sıra.Sütunları içeren bir sonuç kümesi olarak deyim iletileri verir conversation_handle, message_type_name, ve message_body.

RECEIVE conversation_handle, message_type_name, message_body
FROM ExpenseQueue ;

C.İlk kullanılabilir ileti sıraya alma

Aşağıdaki örnek ilk kullanılabilir iletisinden alır ExpenseQueue bir sonuç kümesiolarak sıra.

RECEIVE TOP (1) * FROM ExpenseQueue ;

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

Aşağıdaki örnek belirli bir konuşma için tüm kullanılabilir iletilerini alır ExpenseQueue bir sonuç kümesiolarak sıra.

DECLARE @conversation_handle UNIQUEIDENTIFIER ;

SET @conversation_handle = <retrieve conversation from database> ;

RECEIVE *
FROM ExpenseQueue
WHERE conversation_handle = @conversation_handle ;

E.Belirtilen konuşma grubuiletileri alma

Aşağıdaki örnek belirtilen konuşma grubu için tüm kullanılabilir iletilerini alır ExpenseQueue bir sonuç kümesiolarak sıra.

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 örnek bir belirtilen konuşma grubu için tüm kullanılabilir iletilerini alır ExpenseQueue kuyruğuna 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 sonraki kullanılabilir konuşma grubu için tüm kullanılabilir iletilerini alır ExpenseQueue sıra.deyim en az bir ileti kullanılabilir sonra tüm ileti sütunlarını içeren bir sonuç kümesi döndürür bekler.

WAITFOR (
    RECEIVE *
    FROM ExpenseQueue) ;

H.İleti alma ve belirtilen aralık için bekliyor

Aşağıdaki örnek sonraki kullanılabilir konuşma grubu için tüm kullanılabilir iletilerini alır ExpenseQueue sıra.Hangisi ilk 60 saniye veya en az bir ileti kullanılabilir duruma gelene kadar oluşur deyim bekler.En az bir ileti varsa, tüm ileti sütunlarını içeren bir sonuç kümesi deyim döndürür.Aksi halde, bir boş sonuç kümesi deyim döndürür.

WAITFOR (
    RECEIVE *
    FROM ExpenseQueue ),
TIMEOUT 60000 ;

Ö.Bir sütuntürünü değiştirme, iletileri alma

Aşağıdaki örnek sonraki kullanılabilir konuşma grubu için tüm kullanılabilir iletilerini alır ExpenseQueue sıra.ileti türü ileti bir xml belgesi içeren durumları, deyim ileti gövdesi xml 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 durumu alınırken ileti gövdesinden veri ayıklarken, bir ileti alma

Aşağıdaki örnek sonraki kullanılabilir konuşma grubu için kullanılabilir bir sonraki iletiye alır ExpenseQueue sıra.İleti türünü olduğunda //Adventure-Works.com/Expenses/SubmitExpense, deyim , çalışan kimliği ve ileti gövdesi öğelerin listesini ayıklardeyim de konuşma durumunu alır ConversationStatetablo.

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 ;