SEND (Transact-SQL)

Dotyczy:SQL ServerAzure SQL Managed Instance

Wysyła wiadomość, korzystając z jednej lub kilku istniejących rozmów.

Transact-SQL konwencje składni

Składnia

  
SEND  
   ON CONVERSATION [(]conversation_handle [,.. @conversation_handle_n][)]  
   [ MESSAGE TYPE message_type_name ]  
   [ ( message_body_expression ) ]  
[ ; ]  

Arguments

W ROZMOWIE conversation_handle [.. @conversation_handle_n]
Określa rozmowy, do których należy ta wiadomość. conversation_handle musi zawierać ważny identyfikator rozmowy. Ten sam nick rozmowy nie może być używany więcej niż raz.

MESSAGE TYPE message_type_name
Określa typ wiadomości wysłanej. Ten typ wiadomości musi być uwzględniony w umowach usługowych używanych w tych rozmowach. Te umowy muszą umożliwić wysłanie typu wiadomości z tej strony rozmowy. Na przykład usługi docelowe rozmów mogą wysyłać tylko wiadomości określone w kontrakcie jako WYSŁANE PRZEZ CEL lub WYSŁANE PRZEZ DOWOLNE. Jeśli ta klauzula zostanie pominięta, wiadomość ma typ DEFAULTwiadomości .

message_body_expression
Dostarcza wyrażenie reprezentujące treść wiadomości. message_body_expression jest opcjonalny. Jednak jeśli message_body_expression jest obecny, wyrażenie musi być typu, który można przekształcić na varbinary(max). Wyrażenie nie może być NULL. Jeśli ta klauzula zostanie pominięta, treść wiadomości jest pusta.

Remarks

Important

Jeśli SEND zdanie nie jest pierwszym zdaniem w procedurze wsadowej lub przechowywanej, poprzedzające zdanie musi być zakończone średnikiem (;)).

Oświadczenie SEND przekazuje wiadomość od usług z jednej lub kilku rozmów z Service Brokerem do usług po drugiej stronie tych rozmów. Następnie instrukcja służy RECEIVE do pobrania wysłanej wiadomości z kolejek powiązanych z usługami docelowymi.

Nazwy rozmów podane do klauzuli ON CONVERSATION pochodzą z jednego z trzech źródeł:

  • Gdy wysłana wiadomość nie jest odpowiedzią na wiadomość otrzymaną od innej usługi, użyj uchwytu konwersacji, który zwraca się z instrukcji BEGIN DIALOG, która utworzyła rozmowę.

  • Gdy wysłana wiadomość jest odpowiedzią na wiadomość wcześniej otrzymaną od innej usługi, użyj uchwytu konwersacji zwróconego przez RECEIVE wyrażenie, które zwróciło oryginalną wiadomość.

  • Kod zawierający SEND polecenie bywa czasem oddzielny od kodu, który zawiera BEGIN DIALOG lub RECEIVE instrukcje dostarczające uchwyt rozmowy. W takich przypadkach uchwyt konwersacji musi być jednym z elementów danych w informacji stanu, które są przekazywane do kodu zawierającego SEND zaświadczenie.

Wiadomości wysyłane do usług w innych instancjach SQL Server Database Engine są przechowywane w kolejce transmisji w aktualnej bazie danych, dopóki nie zostaną przesłane do kolejek usług w zdalnych instancjach. Wiadomości wysyłane do usług w tej samej instancji Database Engine są umieszczane bezpośrednio w kolejkach powiązanych z tymi usługami. Jeśli warunek uniemożliwia bezpośrednie trafienie lokalnej wiadomości do docelowej kolejki usług, kolejka transmisji może ją przechowywać do czasu rozwiązania warunku. Przykładami takich zdarzeń są pewne typy błędów lub nieaktywność docelowej kolejki usług. Możesz użyć widoku systemu sys.transmission_queue , aby zobaczyć wiadomości w kolejce transmisji.

SEND jest stwierdzeniem atomowym. Jeśli SEND polecenie wysyła wiadomość w wielu rozmowach i nie powiodę się, na przykład gdy rozmowa jest w stanie błędu, żadne wiadomości nie są przechowywane w kolejce transmisji ani umieszczane w żadnej docelowej kolejce usług.

Service Broker optymalizuje przechowywanie i przesyłanie wiadomości wysyłanych w wielu rozmowach w jednym SEND wyświetleniu.

Komunikaty w kolejkach transmisji dla wystąpienia są przesyłane w sekwencji na podstawie:

  • Poziom priorytetu skojarzonego punktu końcowego konwersacji.

  • Na poziomie priorytetu ich sekwencja wysyłania w konwersacji.

Poziomy priorytetów określone w priorytetach rozmów są stosowane do wiadomości w kolejce transmisji tylko wtedy, gdy opcja HONOR_BROKER_PRIORITY bazy danych jest ustawiona na ON. Jeśli HONOR_BROKER_PRIORITY jest ustawione na WYŁĄCZONE, wszystkie wiadomości w kolejce transmisji dla tej bazy danych otrzymują domyślny poziom priorytetu 5. Poziomy priorytetów nie są stosowane do sytuacjiSEND, gdy wiadomości trafiają bezpośrednio do kolejki serwisów w tej samej instancji co Database Engine.

Oświadczenie SEND osobno blokuje każdą rozmowę, w której wysyłana jest wiadomość, aby zapewnić dostawę zamówioną na każdą rozmowę.

SEND nie jest poprawne w funkcji zdefiniowanej przez użytkownika.

Permissions

Aby wysłać wiadomość, aktualny użytkownik musi mieć RECEIVE uprawnienia do kolejki każdej usługi, która wysyła tę wiadomość.

Examples

Poniższy przykład rozpoczyna dialog i wysyła komunikat XML w dialogu. Aby wysłać wiadomość, przykład konwertuje obiekt xml na varbinary(max).

DECLARE @dialog_handle UNIQUEIDENTIFIER,
    @ExpenseReport XML;

SET @ExpenseReport = <construct message as appropriate for the application>;

BEGIN DIALOG @dialog_handle
    FROM SERVICE [//Adventure-Works.com/Expenses/ExpenseClient]
    TO SERVICE '//Adventure-Works.com/Expenses'
    ON CONTRACT [//Adventure-Works.com/Expenses/ExpenseProcessing];

SEND ON CONVERSATION @dialog_handle
    MESSAGE TYPE [//Adventure-Works.com/Expenses/SubmitExpense](@ExpenseReport);

Poniższy przykład rozpoczyna trzy dialogi i wysyła komunikat XML do każdego z nich.

DECLARE
    @dialog_handle1 UNIQUEIDENTIFIER,
    @dialog_handle2 UNIQUEIDENTIFIER,
    @dialog_handle3 UNIQUEIDENTIFIER,
    @OrderMsg XML;

SET @OrderMsg = '<construct message as appropriate for the application>';

BEGIN DIALOG @dialog_handle1
    FROM SERVICE [//InitiatorDB/InitiatorService]
    TO SERVICE '//TargetDB1/TargetService'
    ON CONTRACT [//AllDBs/OrderProcessing];

BEGIN DIALOG @dialog_handle2
    FROM SERVICE [//InitiatorDB/InitiatorService]
    TO SERVICE '//TargetDB2/TargetService'
    ON CONTRACT [//AllDBs/OrderProcessing];

BEGIN DIALOG @dialog_handle3
    FROM SERVICE [//InitiatorDB/InitiatorService]
    TO SERVICE '//TargetDB3/TargetService'
    ON CONTRACT [//AllDBs/OrderProcessing];

SEND ON CONVERSATION (
    @dialog_handle1,
    @dialog_handle2,
    @dialog_handle3
)
    MESSAGE TYPE [//AllDBs/OrderMsg](@OrderMsg); 

Zobacz też

BEGIN DIALOG CONVERSATION (Transact-SQL)
END CONVERSATION (Transact-SQL)
RECEIVE (Transact-SQL)
sys.transmission_queue (Transact-SQL)