(Transact-sql) alma

Bir veya daha fazla ileti sıradan alır. Bağlı saklama sıranın, iletiyi sıradan kaldırır veya ileti sırasındaki durumunu güncelleştirir.

Konu bağlantısı simgesi Transact-SQL Sözdizim 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 Al deyimi üzerinde sıra geldiğinde bir ileti bekler belirtir.

  • TOP( n )
    Döndürülen iletilerin sayısını belirtir. Bu yan tümcesi belirtilirse, bu deyimi ölçüte uyan tüm iletiler döndürülür.

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

  • column_name
    Bir sütunun sonuç içerecek şekilde ayarlayın.

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

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

  • Kaynak
    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 namesağlanır, geçerli veritabanının varsayılan.

  • schema_name
    İleti almak için sıra sahibi olan şema adı. Hayır schema namesağlanır, geçerli kullanıcı için varsayılan şema varsayılanlara.

  • queue_name
    İleti almak için sıra adı.

  • İÇİNEtable_variable
    İletilere alma yerleri tablo değişkeni belirtir. Tablo değişkeni olarak iletileri sütun sayısı aynı olması gerekir. Tablo değişkeni her sütunun veri türü mesajlar ilgili sütunun veri türüne örtük olarak dönüştürülebilir olmalıdır. Hedef belirtilmezse, iletileri kümesi sonucu döndürülür.

  • BURADA
    Konuşma veya konuşma Grup alınan iletileri belirtir. Belirtilmezse, bir sonraki kullanılabilir konuşma grubundan iletileri verir.

  • conversation_handle =conversation_handle
    Konuşma için alınan iletileri belirtir. conversation handleMutlaka sağlanan olmak bir uniqueidentifer, ya da Cabrio için bir türü uniqueidentifier.

  • conversation_group_id =conversation_group_id
    Alınan iletiler için konuşma grubu belirtir. conversation group ID that isMutlaka sağlanan olmak bir uniqueidentifier, ya da bir tür Cabrio uniqueidentifier.

  • ZAMAN AŞIMItimeout
    Deyimi bir ileti için beklenecek milisaniye cinsinden süre miktarını belirtir. Bu yan tümcesi yalnızca WAITFOR yan tümcesinde kullanılır. Bu yan belirtilmemiş veya zaman aşımı -1, bekleme süresi sınırsızdır. Zaman aşımı süresi dolarsa, Al bir boş sonuç kümesi döndürür.

Açıklamalar

Önemli notÖnemli

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

Al deyimi bir sıradan iletileri okur ve bir sonuç kümesi verir. Sonuç kümesi, her biri tek bir ileti içeren sıfır veya daha fazla satır, oluşur. INTO yan kullanılmazsa, ve column_specifierdeğerleri atamaz Yerel değişkenler için deyimi döndürür bir sonuç kümesi arama programı.

Al deyimi tarafından döndürülen iletileri farklı ileti türleri olabilir. Uygulamaları kullanarak message_type_name bu kodu her ileti yönlendirmek için sütun ilişkili ileti türünü işler. İki sınıf ileti türleri vardır:

  • create message type deyimi kullanılarak oluşturulan uygulama tanımlı ileti türleri. Konuşmada izin verilen uygulama tanımlı ileti türleri kümesi tarafından tanımlanan Service Brokerkonuşma için belirtilen sözleşme.

  • Service BrokerSistem bu durum ya da hata bilgi mesajları.

Sıranın ileti saklama belirtmediği sürece Al deyimi alınan iletilerin sıradan kaldırır. Sıra saklama ayarı on, Al deyimi güncelleştirmeleri olduğunda durum sütun 0 ve sıradaki iletileri bırakır. Al deyimi içeren bir hareketi geri alır, işlem sırasındaki tüm değişiklikleri de geri dönen iletiler sıraya alınır.

Al deyimi tarafından döndürülen tüm iletileri aynı konuşma grubuna aittir. Al deyimi konuşma group deyimi içeren işlem bitene kadar döndürülen iletilerin kilitler. İletileri al deyimi döndürür bir durum , 1. Al deyimi tarafından döndürülen sonuç kümesi örtülü olarak sıralanır:

  • İletileri birden çok konuşmaları where yan tümcesinde koşulları karşılamıyorsa, iletileri başka bir konuşma için verir önce Al deyimi bir konuşma tüm iletileri verir. Konuşma öncelik düzeyi azalan sırayla işlenir.

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

Al deyimi where yan tümcesi yalnızca ya da kullanan bir arama koşulu içeren conversation_handle veya conversation_group_id. Arama koşulu bir veya daha fazla sırayı diğer sütunlarda içeremez. Conversation_handle veya conversation_group_id bir deyim olamaz. Döndürülen iletileri kümesi, where yan tümcesinde belirtilen koşullara bağlıdır:

  • Eğer conversation_handle belirtilirse, alma, gelen belirtilen konuşma sırasındaki kullanılabilir tüm iletiler döndürür.

  • Eğer conversation_group_id belirtilirse, Al belirtilen konuşma grubu üyesi olan herhangi bir konuşma sıradan bulunan tüm iletiler döndürür.

  • where yan ise, hangi görüşme Grup alma belirler:

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

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

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

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

Konuşma tutamacını veya where yan tümcesi yok veya değil de belirtilen konuşma Grup tanımlayıcısını belirtilen sırayla ilişkili, Al deyimi, bir hata döndürür.

Al deyimi içinde belirtilen sıra off için ayarlanmış sıra durumu varsa, deyimi ile başarısız bir Transact-SQLhata.

WAITFOR yan tümcesi belirtildiğinde, belirtilen zaman aşımı için bekler veya kadar bir sonuç kümesi kullanılabilir. Sıraya düştü ya da açıklama bekliyor iken sırasının durumunu off için ayarlanır, deyimi hemen bir hata döndürür. Bu görüşme bırakılan ya da başka bir sıraya taşındı bir görüşme Grup veya konuşma tanıtıcı ve hizmeti Al deyimi belirtir, Al deyimi raporları bir Transact-SQLhata.

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

Al deyimi hiçbir öncelik açlık önleme sahiptir. Tek Al deyimi bir görüşme Grup kilitleri ve düşük öncelikli konuşmaları iletileri bir sürü alır, hiçbir ileti öncelik konuşmaları grubunda alınabilir. Düşük öncelikli konuşmaları iletilerini alırken bunu önlemek için mesaj her Al deyimi tarafından adresinden alındı sınırlamak için top yan tümcesi kullanın.

Sıra sütunlar

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

Sütun adı

Veri türü

Açıklama

durumu

tinyint

İletinin durumunu. Al komutu tarafından döndürülen iletilerin 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üzeyi.

queuing_order

bigint

Sırasındaki ileti sipariş numarası.

conversation_group_id

uniqueidentifier

Bu iletiye ait olduğu konuşma grubu için tanımlayıcı.

conversation_handle

uniqueidentifier

Bu ileti parçası olan konuşma tanıtıcı.

message_sequence_number

bigint

Konuşma iletinin sıra numarası.

HİZMET_ADI

nvarchar(512)

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

service_id

int

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

service_contract_name

nvarchar(256)

Görüşme izleyen sözleşme adı.

service_contract_id

int

SQL Servergörüşme izleyen sözleşme 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 Servernesne tanımlayıcısı ileti türü ileti açıklar.

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 izni olmalıdır.

Örnekler

A.Tüm iletiler için tüm sütunları bir görüşme Grup alma

Aşağıdaki örnek sonraki kullanılabilir konuşma grubundan için tüm kullanılabilir iletilerini alır ExpenseQueuekuyruğu. Açıklamada, iletiler sonuç olarak ayarlamak döndürür.

RECEIVE * FROM ExpenseQueue ;

RECEIVE * FROM ExpenseQueue ;

B.Alıcı belirtilen sütunlar konuşma grubundaki tüm iletileri için

Aşağıdaki örnek sonraki kullanılabilir konuşma grubundan için tüm kullanılabilir iletilerini alır ExpenseQueuekuyruğu. İletiler sonuç olarak ayarlamak sütun içeren deyimi döndürür conversation_handle, message_type_name, ve message_body.

RECEIVE conversation_handle, message_type_name, message_body
FROM ExpenseQueue ;

RECEIVE conversation_handle, message_type_name, message_body
FROM ExpenseQueue ;

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

Aşağıdaki örnekte ilk kullanılabilir iletisinden alır ExpenseQueuesonucunda kümesi sıra.

RECEIVE TOP (1) * FROM ExpenseQueue ;

RECEIVE TOP (1) * FROM ExpenseQueue ;

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

Aşağıdaki örnek belirtilen konuşma için tüm kullanılabilir iletilerini alır ExpenseQueueSonuç olarak set kuyruk.

DECLARE @conversation_handle UNIQUEIDENTIFIER ;

SET @conversation_handle = <retrieve conversation from database> ;

RECEIVE *
FROM ExpenseQueue
WHERE conversation_handle = @conversation_handle ;

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 örnek belirtilen konuşma grubundan için tüm kullanılabilir iletilerini alır ExpenseQueueSonuç olarak set kuyruk.

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 ;

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.Tablo değişkeni alma

Aşağıdaki örnek belirtilen konuşma grubundan için tüm kullanılabilir iletilerini alır ExpenseQueuetablo değişkeni kuyruğa.

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 ;

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.Alma ve süresiz bekleniyor

Aşağıdaki örnek bir sonraki kullanılabilir konuşma Grup tüm kullanılabilir iletilerini alır ExpenseQueuekuyruğu. Deyim bekler, en az bir ileti kullanılabilir sonra tüm ileti sütunlarını içeren bir sonuç kümesi döndürür.

WAITFOR (
    RECEIVE *
    FROM ExpenseQueue) ;

WAITFOR (
    RECEIVE *
    FROM ExpenseQueue) ;

H.Alma ve belirtilen aralık için bekleniyor

Aşağıdaki örnek bir sonraki kullanılabilir konuşma Grup tüm kullanılabilir iletilerini alır ExpenseQueuekuyruğu. İçin 60 saniye ya da en azından bir ileti kullanılabilir hale gelinceye kadar hangisi ilk olursa deyimi bekler. Deyimi en az bir mesaj varsa tüm ileti sütunlarını içeren bir sonuç kümesi döndürür. Aksi takdirde, deyimi boş sonuç kümesi döndürür.

WAITFOR (
    RECEIVE *
    FROM ExpenseQueue ),
TIMEOUT 60000 ;

WAITFOR (
    RECEIVE *
    FROM ExpenseQueue ),
TIMEOUT 60000 ;

I.Bir sütunun türünü değiştirme, iletileri alma

Aşağıdaki örnek bir sonraki kullanılabilir konuşma Grup tüm kullanılabilir iletilerini alır ExpenseQueuekuyruğu. İletiyi bir xml belgesi içeren ileti türünü belirtir, deyimi 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 ;

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 aldığı bir sonraki kullanılabilir konuşma Grup kullanılabilir bir sonraki iletiye ExpenseQueuekuyruğu. İleti türü ne zaman //Adventure-Works.com/Expenses/SubmitExpense, ileti gövdesinden deyimi çalışan kimliği ve öğelerin listesini ayıklar. Deyimi de görüşme durumunu alır ConversationStatetablosu.

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 ;

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 ;

Ayrıca bkz.

Başvuru

BEGIN DIALOG konuşma (Transact-sql)

Konuşma süreölçer (Transact-sql) başlar

move konuşma (Transact-sql)

Sözleşme (Transact-sql) oluştur

İLETİ türü (Transact-sql) oluştur

SEND (Transact-sql)

SIRA (Transact-sql) oluştur

alter queue (Transact-sql)

SIRA (Transact-sql) bırak