SEND (Transact-SQL)

Van toepassing op:SQL ServerAzure SQL Managed Instance

Stuurt een bericht, met behulp van een of meer bestaande gesprekken.

Transact-SQL syntaxis-conventies

Syntax

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

Arguments

OVER GESPREK conversation_handle [.. @conversation_handle_n]
Specificeert de gesprekken waartoe het bericht behoort. De conversation_handle moet een geldige conversatie-identificatie bevatten. Dezelfde gesprekshandle kan niet meer dan één keer worden gebruikt.

MESSAGE TYPE message_type_name
Specificeert het type bericht van het verzonden bericht. Dit berichttype moet worden opgenomen in de servicecontracten die door deze gesprekken worden gebruikt. Deze contracten moeten toestaan dat het type bericht vanuit deze kant van het gesprek wordt verzonden. Bijvoorbeeld, de doeldiensten van de gesprekken mogen alleen berichten sturen die in het contract zijn gespecificeerd als VERZONDEN DOOR DOEL of VERZONDEN DOOR EEN. Als deze clausule wordt weggelaten, is het bericht van het berichttype DEFAULT.

message_body_expression
Geeft een expressie die het berichtlichaam vertegenwoordigt. De message_body_expression is optioneel. Als de message_body_expression aanwezig is, moet de expressie echter van een type zijn dat kan worden omgezet naar varbinair(max). De uitdrukking kan niet NULL zijn. Als deze clausule wordt weggelaten, is het berichtlichaam leeg.

Remarks

Important

Als de SEND instructie niet de eerste instructie is in een batch of opgeslagen procedure, moet de voorgaande verklaring worden beëindigd met een puntkomma (;).

De SEND verklaring zendt een bericht uit van de diensten aan het ene uiteinde van een of meer Service Broker-gesprekken naar de diensten aan de andere kant van deze gesprekken. De RECEIVE instructie wordt vervolgens gebruikt om het verzonden bericht op te halen uit de wachtrijen die aan de doelservices zijn gekoppeld.

De gesprekshandvaten die bij de ON CONVERSATION-clausule worden geleverd, komen uit een van drie bronnen:

  • Wanneer een verzonden bericht niet reageert op een bericht van een andere dienst, gebruik je de gesprekshandle die terugkeert van de BEGIN DIALOG-instructie die het gesprek heeft aangemaakt.

  • Wanneer een verzonden bericht een antwoord is op een bericht dat eerder van een andere dienst is ontvangen, gebruik dan de conversatiehandle die wordt teruggegeven door de RECEIVE instructie die het oorspronkelijke bericht terugstuurde.

  • De code die de SEND instructie bevat is soms gescheiden van de code die ofwel de BEGIN DIALOG of RECEIVE statements bevat die de conversation handle leveren. In deze gevallen moet de conversationhandle een van de data-items zijn in de toestandsinformatie die wordt doorgegeven aan de code met de SEND instructie.

Berichten die naar services in andere instanties van de SQL Server Database Engine worden gestuurd, worden opgeslagen in een transmissiewachtrij in de huidige database totdat ze naar de servicewachtrijen in de externe instanties kunnen worden verzonden. Berichten die naar services worden gestuurd in dezelfde instantie van de Database Engine, worden direct in de wachtrijen geplaatst die aan deze services zijn gekoppeld. Als een voorwaarde voorkomt dat een lokaal bericht direct in de doelservicewachtrij gaat, kan de transmissiewachtrij het opslaan totdat de voorwaarde is opgelost. Voorbeelden van deze gevallen zijn onder andere bepaalde soorten fouten of dat de doelservicewachtrij inactief is. Je kunt de sys.transmission_queue systeemweergave gebruiken om de berichten in de transmissiewachtrij te zien.

SEND is een atomaire uitspraak. Als een SEND instructie een bericht stuurt bij meerdere gesprekken en faalt, bijvoorbeeld wanneer een gesprek in een foutstatus is, worden er geen berichten opgeslagen in de transmissiewachtrij of in een doelservicewachtrij geplaatst.

Service Broker optimaliseert de opslag en verzending van berichten die via meerdere gesprekken in dezelfde SEND verklaring worden verzonden.

Berichten in de overdrachtswachtrijen voor een exemplaar worden op volgorde verzonden op basis van:

  • Het prioriteitsniveau van het bijbehorende gesprekseindpunt.

  • Binnen prioriteitsniveau, hun verzendvolgorde in het gesprek.

Prioriteitsniveaus die in gespreksprioriteiten zijn gespecificeerd, worden alleen toegepast op berichten in de transmissiewachtrij als de optie HONOR_BROKER_PRIORITY database op AAN staat. Als HONOR_BROKER_PRIORITY op UIT staat, krijgen alle berichten in de transmissiewachtrij voor die database het standaardprioriteitsniveau van 5 toegewezen. Prioriteitsniveaus worden niet toegepast op een SEND waarbij berichten direct in een servicewachtrij worden geplaatst in dezelfde instantie van de Database Engine.

De SEND verklaring vergrendelt elk gesprek waarop een bericht wordt verzonden afzonderlijk om te zorgen voor de bestelling per gesprek.

SEND is niet geldig in een door de gebruiker gedefinieerde functie.

Permissions

Om een bericht te verzenden, moet de huidige gebruiker toestemming hebben RECEIVE voor de wachtrij van elke dienst die het bericht verstuurt.

Examples

Het volgende voorbeeld start een dialoog en stuurt een XML-bericht naar het dialoog. Om het bericht te verzenden, zet het voorbeeld het xml-object om naar 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);

Het volgende voorbeeld start drie dialogen en stuurt een XML-bericht naar elk van hen.

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); 

Zie ook

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