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.
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ż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 ;
Zobacz także