Udostępnij za pośrednictwem


RECEIVE (Transact-SQL)

System assemblies.Assembly ownership.

Topic link iconKonwencje składni języka Transact-SQL

[ 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

  • POLECENIE WAITFOR
    Określa, że instrukcja RECEIVE czeka na pojawienie się komunikatu w kolejce, jeśli obecnie nie ma żadnego komunikatu.

  • TOP( n )
    Adding new public methods.Modifying private methods in any way.

  • *
    Fields contained within a native-serialized user-defined type, including data members or base classes, cannot be changed by using ALTER ASSEMBLY.

  • column_name
    All other changes are unsupported.

  • expression
    If ADD FILE FROM is not specified, ALTER ASSEMBLY drops any files associated with the assembly.

  • column_alias
    If ALTER ASSEMBLY is executed without the UNCHECKED data clause, checks are performed to verify that the new assembly version does not affect existing data in tables.

  • Z
    Depending on the amount of data that needs to be checked, this may affect performance.

  • database_name
    Requires ALTER permission on the assembly.Jeśli nie database name zostanie podana, domyślnie: Bieżąca baza danych.

  • schema_name
    Additional requirements are as follows:Jeśli nie schema name podano, domyślna wartość domyślnego schematu dla bieżącego użytkownika.

  • queue_name
    Nazwa kolejki, z której mają być odbierane komunikaty.

  • INTO table_variable
    Określa zmienną tabeli, w której instrukcja RECEIVE umieszcza komunikaty.Zmienna tabeli musi mieć taką samą liczbę kolumn jak komunikat.Typ danych poszczególnych kolumn w zmiennej tabeli musi być jawnie przekształcalny na typ danych odpowiadającej kolumny w komunikatach.Jeśli instrukcja INTO nie zostanie określona, jako zestaw wyników są zwracane komunikaty.

  • GDZIE
    Określa konwersację lub grupę konwersacji dla odebranych komunikatów.Pominięcie powoduje zwrócenie komunikatów z następnej dostępnej grupy konwersacji.

  • conversation_handle = conversation_handle
    Adding a file to associate with an assemblyThe conversation handle provided must be a uniqueidentifer, or a type that is convertible to uniqueidentifier.

  • conversation_group_id = conversation_group_id
    Changing the permissions of an assemblyThe conversation group ID that is provided must be a uniqueidentifier, or a type convertible to uniqueidentifier.

  • TIMEOUT timeout
    Określa czas, w milisekundach, przez jaki instrukcja czeka na komunikat.Ta klauzula może być używana jedynie z klauzulą WAITFOR.Jeśli ta klauzula nie zostanie określona lub limit czasu zostanie określony jako -1, czas oczekiwania będzie nieograniczony.Gdy upłynie limit czasu, instrukcja RECEIVE otrzyma pusty zestaw wyników.

Remarks

Important noteImportant Note:

Jeśli instrukcja RECEIVE nie będzie pierwszą instrukcją zadania wsadowego lub procedury składowanej, poprzednia instrukcja musi być zakończona średnikiem (;).

Instrukcja RECEIVE odczytuje komunikaty z kolejki i zwraca zestaw wyników.Zestaw wyników składa się z zera lub więcej wierszy, a każdy wiersz zawiera jeden komunikat.Jeśli nie została użyta klauzula INTO i parametr column_specifier nie przypisuje wartości zmiennym lokalnym, instrukcja zwraca zestaw wyników do programu wywołującego.

IsDescendingAplikacje mogą używać message_type_name kolumna do kierowania wiadomości do kodu, który obsługuje typ komunikatu skojarzonego.1 = Descending 0 = Ascending

  • Typy komunikatów zdefiniowane przez aplikację utworzone przy użyciu instrukcji CREATE MESSAGE TYPE.Zestaw zdefiniowanych przez aplikację typów komunikatów dozwolonych w konwersacji jest zdefinowany przez kontrakt programu Service Broker określony dla konwersacji.

  • Service Broker Lists information (except passwords) about Database Mail accounts.Aby uzyskać więcej informacji zobaczKomunikaty systemu brokera.

Instrukcja RECEIVE usuwa odebrane komunikaty z kolejki, chyba że kolejka określa przechowywanie komunikatów.Gdy ustawienie RETENTION dla kolejki ma wartość ON, instrukcja RECEIVE aktualizuje kolumnę status, nadając jej wartość 0, i pozostawia komunikaty w kolejce.Gdy transakcja zawierająca instrukcję RECEIVE zostanie wycofana, wszystkie zmiany kolejki w czasie transakcji są także wycofywane, co powoduje przywrócenie komunikatów do kolejki.

The ID of the account.The description for the account.Instrukcja przyjęcie zwraca wiadomości, które mają Stan of 1. The e-mail address to send messages from.

  • display_nameThe display name for the account.

  • Dla danej konwersacji instrukcja przyjęcie zwraca wiadomości w kolejności rosnącej message_sequence_number zamówienia.

Klauzula WHERE instrukcja przyjęcie może zawierać tylko jeden warunek wyszukiwania, który używa albo conversation_handle or conversation_group_id.servertypeThe conversation_handle or conversation_group_id cannot be an wyrażenie.The name of the e-mail server for the account.

  • Jeśli conversation_handle jest określony, przyjęcie zwraca wszystkie wiadomości od określonego konwersacji, które są dostępne w kolejce.

  • Jeśli conversation_group_id jest określony, wszystkie wiadomości, które są dostępne w kolejce z każdej konwersacji, należącego do grupa konwersacji określonego zwraca przyjęcie.

  • Jeśli nie ma klauzuli WHERE, instrukcja RECEIVE określa, która grupa konwersacji:

    • use_default_credentials

    • nie została zablokowana przez inną instrukcję RECEIVE;

    • ma najwyższy poziom priorytetu ze wszystkich grup konwersacji spełniających te kryteria.

    Instrukcja RECEIVE zwraca następnie wszystkie komunikaty dostępne w kolejce z wszelkich konwersacji należących do wybranej grupy konwersacji.

Jeśli uchwyt konwersacji lub identyfikator grupy określony w klauzuli WHERE nie istnieje lub nie jest skojarzony z określoną kolejką, instrukcja RECEIVE zawraca błąd.

Jeśli kolejka określona w instrukcji przyjęcie ma stan kolejki zestaw do OFF, instrukcja kończy się niepowodzeniem i nie następuje Transact-SQL Wystąpił błąd.

Replaced by…Example of replacement keywordJeśli instrukcja przyjęcie Określa grupa konwersacji lub uchwyt konwersacji i usługa w odniesieniu do tej konwersacji jest usunięty lub przeniesiony do innej kolejki, instrukcja przyjęcie raportuje Transact-SQL Wystąpił błąd.

TRANSACTION

DBO_ONLYRequirement for Restoring an Encrypted DatabaseTo restore a database that is encrypted, you must have access to the certificate or asymmetric key that was used to encrypt the database.

Without the certificate or asymmetric key, the database cannot be restored.

As a result, the certificate that is used to encrypt the database encryption key must be retained as long as the backup is needed.

Nazwa kolumna

Typ danych

Description

Stan

tinyint

Stan komunikatu.Dla komunikatów zwróconych przez polecenie RECEIVE stan ma zawsze wartość 0.Komunikaty w kolejce mogą zawierać jedną z następujących wartości:

0=Ready1= $ Wiadomości odebrane2 Nie zostały jeszcze pełnej =3= Retained wysłana wiadomość

priorytet

tinyint

Roll back is controlled by the RESTORE statement through the [ RECOVERY | NORECOVERY ] options:

NORECOVERY specifies that roll back not occur.

bigint

This allows roll forward to continue with the next statement in the sequence.

conversation_group_id

uniqueidentifier

Identyfikator grupy konwersacji, do której należy ten komunikat.

conversation_handle

uniqueidentifier

Uchwyt konwersacji, której częścią jest ten komunikat.

message_sequence_number

bigint

Numer sekwencyjny komunikatu w konwersacji.

nazwa_usługi

nvarchar(512)

Redoing a Restore

service_id

int

SQL Server Undoing the effects of a restore is not possible; however, you can negate the effects of the data copy and roll forward by starting over on a per-file basis.

To start over, restore the desired file and perform the roll forward again.

nvarchar(256)

For example, if you accidentally restored too many log backups and overshot your intended stopping point, you would have to restart the sequence.

service_contract_id

int

SQL Server A restore sequence can be aborted and restarted by restoring the entire contents of the affected files.

Restore Full-Text Data

nvarchar(256)

Nazwa typu komunikatu opisująca jego format.Komunikaty mogą być następujących typów: komunikaty aplikacji lub komunikaty systemu Broker.

message_type_id

int

SQL Server The RESTORE statement also can be used to perform restores to alternate locations, differential restores, file and filegroup restores, and differential file and filegroup restores of full-text data.

Reguły upgrade advisor wykryć typ użytkownika ani zestawy z konfliktu nazw.

nchar(2)

In addition, RESTORE can restore full-text files only, as well as with database data.

E=EmptyN=NoneX=XML

message_body

varbinary(MAX)

Treść komunikatu.

Uprawnienia

Database Settings and Restoring

Przykłady

A.During a restore, most of the database options that are settable using ALTER DATABASE are reset to the values in force at the time of the end of backup.

W poniższym przykładzie są odbierane wszystkie dostępne komunikaty dla następnej dostępnej grupy konwersacji z kolejki ExpenseQueue.Instrukcja zwraca komunikaty jako zestaw wyników.

RECEIVE * FROM ExpenseQueue ;

B.This setting is always set following a RESTORE statement, which includes the WITH RESTRICTED_USER option.

W poniższym przykładzie są odbierane wszystkie dostępne komunikaty dla następnej dostępnej grupy konwersacji z kolejki ExpenseQueue.Instrukcja zwraca komunikaty 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.includes backup and restore history tables that track the backup and restore activity for each server instance.

W poniższym przykładzie odbiera pierwszy komunikat dostępne z ExpenseQueue w kolejce jako zestaw wyników.

RECEIVE TOP (1) * FROM ExpenseQueue ;

D.Odbieranie wszystkich komunikatów dla określonej konwersacji

W poniższym przykładzie odbiera wszystkie komunikaty dostępne dla określonego konwersacji z ExpenseQueue w kolejce jako zestaw wyników.

DECLARE @conversation_handle UNIQUEIDENTIFIER ;

SET @conversation_handle = <retrieve conversation from database> ;

RECEIVE *
FROM ExpenseQueue
WHERE conversation_handle = @conversation_handle ;

E.RESTORE LOG can include a file list to allow for creation of files during roll forward.

W poniższym przykładzie otrzymuje wszystkie komunikaty dostępne dla określonego grupa konwersacji z ExpenseQueue w rezultacie ustawiony kolejki.

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.For a database using the full or bulk-logged recovery model, in most cases you must back up the tail of the log before restoring the database.

W poniższym przykładzie odbiera wszystkie komunikaty dostępne dla grupy określonej konwersacji z ExpenseQueue Kolejka 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 komunikatów i oczekiwanie w nieskończoność

W poniższym przykładzie są odbierane wszystkie dostępne komunikaty dla następnej dostępnej grupy konwersacji w kolejce ExpenseQueue.Instrukcja czeka do momentu, aż będzie dostępny co najmniej jeden komunikat, a następnie zwraca zestaw wyników zawierający wszystkie kolumny komunikatu.

WAITFOR (
    RECEIVE *
    FROM ExpenseQueue) ;

H.Piecemeal Restore

W poniższym przykładzie są odbierane wszystkie dostępne komunikaty dla następnej dostępnej grupy konwersacji w kolejce ExpenseQueue.Instrukcja czeka 60 sekund lub do momentu, aż będzie dostępny co najmniej jeden komunikat, zależnie od tego, które zdarzenie wystąpi jako pierwsze.Instrukcja zwraca zestaw wyników zawierający wszystkie kolumny komunikatu, 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.The offline filegroups, however, can be restored later by a file restore.

W poniższym przykładzie odbiera wszystkie komunikaty dostępne dla następnej grupa konwersacji dostępne w ExpenseQueue kolejka. To allow the entire database to be restored in stages at different times, piecemeal restore maintain checks to ensure that the database will be consistent in the end.

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 komunikatu, wyodrębnianie danych z treści komunikatu, odczytywanie stanu konwersacji

This restriction was removed in ExpenseQueue. Gdy wiadomość jest typu //Adventure-Works.com/Expenses/SubmitExpense, instrukcja wyodrębnia identyfikator pracownika i listę elementów z treści wiadomości. Instrukcja również pobiera stan dla konwersacji z ConversationState Tabela.

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 ;