ODBIERANIE (Transact-SQL)

Pobiera jeden lub więcej wiadomości z kolejki.W zależności od ustawienia przechowywania dla kolejki usuwa wiadomości z kolejki lub aktualizuje stan wiadomości w kolejce.

Ikona łącza do tematuJęzyka Transact-SQL składni konwencje

Składnia

[ 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
}

Argumenty

  • WAITFOR
    Określa, że przyjęcie instrukcja czeka na wiadomości przychodzące do kolejki, jeśli wiadomości nie są obecne.

  • TOP( n )
    Określa maksymalną liczbę wiadomości mają być zwrócone.Jeżeli nie określono tej klauzula , zwracane są wszystkie wiadomości spełniające kryteria instrukcja .

  • *
    Określa, że zestaw wyników zawiera wszystkie kolumny w kolejce.

  • column_name
    Nazwa kolumna w zestaw wyników.

  • expression
    Nazwa kolumna , stała, funkcjalub dowolną kombinację nazw kolumna , stałe i funkcje połączone za pomocą operator.

  • column_alias
    Alternatywna nazwa zastępuje nazwę kolumna w zestaw wyników.

  • Z
    Określa kolejkę, która zawiera wiadomości do pobrania.

  • database_name
    Nazwa bazy danych, która zawiera odbierać wiadomości z kolejki.Gdy nie database name podano wartości domyślne do bieżącej bazy danych.

  • schema_name
    Nazwa schematu, który jest właścicielem odbierać wiadomości z kolejki.Gdy nie schema name podano domyślne ustawienia do domyślnego schematu dla bieżącego użytkownika.

  • queue_name
    Nazwa do odbierania wiadomości z kolejki.

  • DOtable_variable
    Określa zmienną tabela umieszczające wiadomości do ODBIERANIA.Zmienna tabela musi mieć taką samą liczbę kolumn w wiadomości.Typ danych każdej kolumna w tabela zmiennej musi być jawnie konwertowany na typ danych odpowiedniej kolumna w wiadomości.Jeżeli nie określono INTO, wiadomości są zwracane jako zestaw wyników.

  • W PRZYPADKU GDY
    Określa konwersacji lub grupa konwersacji po odebraniu wiadomości.Jeśli pominięto, zwraca komunikaty z następnego dostępne grupa konwersacji.

  • conversation_handle =conversation_handle
    Określa konwersacji odebranych wiadomości.conversation handle Pod warunkiem musi być uniqueidentifer, lub typu jest konwertowany na uniqueidentifier.

  • conversation_group_id =conversation_group_id
    Określa grupa konwersacji po odebraniu wiadomości.conversation group ID that is Pod warunkiem musi być uniqueidentifier, lub typ można przekonwertować na uniqueidentifier.

  • LIMIT CZASUtimeout
    Określa czasw milisekundach, instrukcja oczekiwania dla wiadomości.Ta klauzula należy używać tylko z WAITFOR klauzula.Jeżeli nie określono tej klauzula , lub czas- się -1, czas oczekiwania jest nieograniczona.Jeśli czas-skończy się limit, ODBIERANIA zwraca pusty zestaw wyników.

Uwagi

Ważna informacjaWażne:

Jeśli ODBIERZ instrukcja nie jest pierwsza instrukcja w procedura składowana partia lub musi zostać zakończona poprzedniego instrukcja średnikiem (;).

PRZYJĘCIE instrukcja czyta wiadomości z kolejki i zwraca zestaw wyników.zestaw wyników składa się zero lub więcej wierszy, z których każdy zawiera jedną wiadomość.Jeśli nie jest używana klauzula INTO, i column_specifier nie przypisuje wartości do zmiennych lokalnych instrukcja zwraca zestaw wyników do programu wywołującego.

Wiadomości, które są zwracane przez przyjęcie instrukcja mogą być różne rodzaje komunikatów.Aplikacje mogą używać message_type_name kolumna do trasa każdej wiadomości do kodu, który obsługuje skojarzonego typ komunikatu.Istnieją dwie klasy typy komunikatów:

  • Typy zdefiniowane przez aplikację wiadomości, które zostały utworzone przy użyciu instrukcjautworzyć typ komunikatu.zestaw typów zdefiniowanych przez aplikację wiadomości, które są dozwolone w konwersacji są definiowane przez Service Brokerkontrakt określono w konwersacji.

  • Service Brokersystem wiadomości zwrotu informacji stanie lub błędzie.Aby uzyskać więcej informacji, zobacz Komunikaty systemowe Broker.

PRZYJĘCIE instrukcja usuwa odebranych wiadomości z kolejki, chyba że kolejki określa przechowywania wiadomości.Gdy ustawienie ZACHOWYWANIA dla kolejki jest włączone, ODBIERZ aktualizacje instrukcja stanu kolumna , aby 0 i pozostawia wiadomości w kolejce.Transakcja, która zawiera ODBIERZ instrukcja wycofuje wszystkie zmiany wprowadzone do kolejki w transakcji są również przywrócenie, zwracania wiadomości do kolejki.

Wszystkie wiadomości, które są zwracane przez przyjęcie instrukcja należą do tej samej grupa konwersacji.PRZYJĘCIE instrukcja blokuje wiadomości, które są zwracane, dopóki nie zakończy się transakcji, która zawiera instrukcja grupa konwersacji .PRZYJĘCIE instrukcja zwraca wiadomości, które mają stanu z 1. zestaw wyników zwrócone przez przyjęcie instrukcja niejawnie porządkowania:

  • Jeśli wiadomości z wielu konwersacji spełniają warunki klauzula WHERE, ODBIERZ instrukcja zwraca wszystkie wiadomości z jednej konwersacji przed zwraca komunikaty dotyczące innych konwersacji.Konwersacje są przetwarzane w kolejności poziom priorytetu.

  • Dla danego konwersacji ODBIERZ instrukcja zwraca wiadomości w kolejności rosnącej message_sequence_number zamówienia.

klauzula ODBIERZ instrukcja może zawierać tylko jeden warunek wyszukiwania , który używa albo conversation_handle lub conversation_group_id.warunek wyszukiwania nie może zawierać jeden lub więcej innych kolumn w kolejce.Conversation_handle lub conversation_group_id nie może być wyrażenie.zestaw komunikaty zwracane zależy od warunków, które są określone w klauzulaWHERE:

  • Jeśli conversation_handle określono ODBIERZ zwraca wszystkie wiadomości od określonej konwersacji, które są dostępne w kolejce.

  • Jeśli conversation_group_id określono ODBIERZ zwraca wszystkie wiadomości, które są dostępne w kolejce z rozmowy element członkowski określonej grupa konwersacji.

  • Jeśli nie klauzulaodbioru określa grupa konwersacji:

    • Zawiera jeden lub więcej wiadomości w kolejce.

    • Nie został zablokowany przez innego ODBIERZ instrukcja.

    • Ma najwyższy priorytet poziom wszystkich grup konwersacji, które spełniają te kryteria.

    ODBIERZ następnie zwraca wszystkie wiadomości w kolejce konwersacji, każdy element członkowski zaznaczonej grupa konwersacji.

Jeśli identyfikator grupa konwersacji lub dojście do konwersacji określonych w klauzula WHERE nie istnieje lub nie jest skojarzona z określonej kolejki, ODBIERANIA instrukcja zwraca błąd.

Jeśli kolejka określona w instrukcja ODBIERZ kolejki stan zestaw na wyłączone, instrukcja nie powiedzie się z Transact-SQL błąd.

Po określeniu WAITFOR klauzula instrukcja czeka przez określony czas poza lub do momentu zestaw wyników jest dostępna.Jeśli kolejka jest przenoszony lub stan kolejki jest zestaw na wyłączone, gdy oczekuje instrukcja , instrukcja niezwłocznie zwraca błąd.ODBIERZ instrukcja Określa grupa konwersacji lub dojście do konwersacji , usunięty lub przeniesiony do innej kolejki usługa dla tej konwersacji ODBIERZ instrukcja raporty Transact-SQL błąd.

ODBIERZ nie jest prawidłowy w zdefiniowanej przez użytkownika funkcja.

ODBIERZ instrukcja zawiera nie priorytet zapobieganie wyzwolony.Pojedynczy ODBIERZ instrukcja blokuje grupa konwersacji , pobiera dużo wiadomości z konwersacji niski priorytet wiadomości nie mogą być odbierane od konwersacji o wysokim priorytecie w grupie.Aby temu zapobiec, kiedy wiadomości są pobierane z konwersacji niski priorytet, należy użyć klauzula TOP ograniczyć liczbę wiadomości pobierane przez każdego odbioru instrukcja.

Kolumny kolejki

W poniższej tabela przedstawiono listę kolumn w kolejce:

Nazwa kolumny

Typ danych

Opis

Stan

tinyint

Stan wiadomości.Komunikaty zwracane przez polecenie ODBIERZ stanu jest zawsze 0.Wiadomości w kolejce mogą zawierać jedną z następujących wartości:

0= Gotowe1= wiadomość odebrano2nie = kompletne3= Retained wysłanych wiadomości

priorytet

tinyint

Konwersacja priorytet poziom stosowanego do wiadomości.

queuing_order

bigint

Numer zamówienia wiadomości w kolejce.

conversation_group_id

uniqueidentifier

Identyfikator grupa konwersacji , należącym do tej wiadomości.

conversation_handle

uniqueidentifier

Uchwyt konwersacji, będącego częścią tej wiadomości.

message_sequence_number

bigint

Numer porządkowy wiadomości w konwersacji.

SERVICE_NAME

nvarchar(512)

Nazwa usługa jest konwersacji.

service_id

int

SQL ServerIdentyfikator obiektu usługa jest konwersacji.

service_contract_name

nvarchar(256)

Nazwa kontrakt , występujący w konwersacji.

service_contract_id

int

SQL ServerIdentyfikator obiektu kontrakt , występujący w konwersacji.

message_type_name

nvarchar(256)

Nazwa typ komunikatu , który opisuje format wiadomości.Wiadomości mogą być typy komunikatów aplikacji lub brokera komunikaty systemowe.

message_type_id

int

SQL Serverobiekt identyfikator typ komunikatu , który opisuje wiadomości.

Sprawdzanie poprawności

nchar(2)

Sprawdzanie poprawności użytego w wiadomości.

E=EmptyN=NoneX=XML

message_body

varbinary(MAX)

Treść wiadomości.

Uprawnienia

Komunikat, bieżący użytkownik musi mieć uprawnienie ODBIERANIE w kolejce.

Przykłady

A.Otrzymywanie wszystkich kolumn dla wszystkich wiadomości w grupa konwersacji

Poniższy przykład odbiera wszystkie wiadomości dostępne dla następnej dostępne grupa konwersacji z ExpenseQueue kolejki.instrukcja zwraca wiadomości jako zestaw wyników.

RECEIVE * FROM ExpenseQueue ;

B.Odbieranie określonych kolumn dla wszystkich wiadomości w grupa konwersacji

Poniższy przykład odbiera wszystkie wiadomości dostępne dla następnej dostępne grupa konwersacji z ExpenseQueue kolejki.instrukcja zwraca wiadomości jako zestaw wyników zawierający kolumny, conversation_handle, message_type_name, i message_body.

RECEIVE conversation_handle, message_type_name, message_body
FROM ExpenseQueue ;

C.Odbieranie dostępne pierwszej wiadomości w kolejce

Poniższy przykład odbiera pierwszej wiadomości dostępne z ExpenseQueue kolejki jako zestaw wyników.

RECEIVE TOP (1) * FROM ExpenseQueue ;

D.Odbiera wszystkie wiadomości konwersacji określony

Poniższy przykład odbiera wszystkie wiadomości dostępne dla określonego konwersacji z ExpenseQueue kolejki jako zestaw wyników.

DECLARE @conversation_handle UNIQUEIDENTIFIER ;

SET @conversation_handle = <retrieve conversation from database> ;

RECEIVE *
FROM ExpenseQueue
WHERE conversation_handle = @conversation_handle ;

E.Odbieranie wiadomości dla określonej grupa konwersacji

Poniższy przykład odbiera wszystkie wiadomości dostępne dla określonej grupa konwersacji z ExpenseQueue kolejki jako zestaw wyników.

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.Odbieranie do zmiennej tabela

Poniższy przykład odbiera wszystkie wiadomości dostępne dla określonej grupa konwersacji z ExpenseQueue kolejki do zmiennej tabela .

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.Odbieranie wiadomości oraz oczekiwania przez czas nieokreślony

Poniższy przykład odbiera wszystkie komunikaty dostępne dla następnego dostępne grupa konwersacji w ExpenseQueue kolejki.instrukcja czeka, aż co najmniej jednym komunikacie staje się dostępna a następnie zwraca zestaw wyników zawierający wszystkie kolumny wiadomości.

WAITFOR (
    RECEIVE *
    FROM ExpenseQueue) ;

H.Odbieranie wiadomości oraz oczekiwania dla określonego interwału

Poniższy przykład odbiera wszystkie komunikaty dostępne dla następnego dostępne grupa konwersacji w ExpenseQueue kolejki.instrukcja czeka na 60 sekund lub do co najmniej jednej wiadomości stają się dostępne, cokolwiek nastąpi najpierw.instrukcja zwraca, zestaw wyników zawierającą wszystkie kolumny wiadomości, jeśli jest dostępny co najmniej jeden komunikat.W przeciwnym wypadku instrukcja zwraca pusty zestaw wyników.

WAITFOR (
    RECEIVE *
    FROM ExpenseQueue ),
TIMEOUT 60000 ;

I.Odbieranie wiadomości, zmieniając typ kolumna

Poniższy przykład odbiera wszystkie komunikaty dostępne dla następnego dostępne grupa konwersacji w ExpenseQueue kolejki.typ komunikatu stwierdza, że wiadomość zawiera dokument XML, instrukcja konwertuje treści wiadomości do pliku XML.

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.Odbieranie wiadomości, wyodrębnianie danych z treści wiadomości Pobieranie stanu konwersacji

Poniższy przykład odbiera następną wiadomość dostępne dla następnego dostępne grupa konwersacji w ExpenseQueue kolejki.Gdy wiadomość jest typu //Adventure-Works.com/Expenses/SubmitExpense, wyciągi instrukcja , identyfikator pracownika i listę elementów z treści wiadomości.instrukcja również pobiera Państwo konwersacji z ConversationStatetabela.

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 ;