SEND (Transact-SQL)

Envoie un message à l'aide d'une conversation existante.

Icône Lien de rubriqueConventions de syntaxe Transact-SQL

Syntaxe

SEND
   ON CONVERSATION conversation_handle
   [ MESSAGE TYPE message_type_name ]
   [ ( message_body_expression ) ]
[ ; ]

Arguments

  • ON CONVERSATION conversation_handle
    Spécifie la conversation à laquelle appartient le message. L'argument conversation_handle doit contenir un identificateur de conversation valide.

  • MESSAGE TYPE message_type_name
    Spécifie le type du message envoyé. Ce type de message doit être inclus dans le contrat de service qu'utilise la conversation. Le contrat doit autoriser l'envoi de ce type de message depuis cette partie de la conversation. Par exemple, la cible de la conversation ne peut envoyer que les messages spécifiés dans le contrat comme SENT BY TARGET ou SENT BY ANY. Si cette clause est omise, le message est du type DEFAULT.

  • message_body_expression
    Fournit une expression représentant le corps du message. L'argument message_body_expression est facultatif. Toutefois, si l'argument message_body_expression est présent, le type d'expression doit pouvoir être converti vers le type varbinary(max). Cette expression ne peut pas avoir la valeur NULL. Si cette clause est omise, le corps du message est vide.

Notes

Important

Si l'instruction SEND n'est pas la première instruction d'un lot ou d'une procédure stockée, l'instruction qui précède doit se terminer par un point-virgule (;).

L'instruction SEND transmet un message à partir du service situé à une extrémité d'une conversation Service Broker au service situé à l'autre extrémité de la conversation. L'instruction RECEIVE permet ensuite d'extraire le message envoyé de la file d'attente associée au service de destination.

Le descripteur de conversation fourni à la clause ON CONVERSATION provient de l'une des deux sources suivantes :

  • lorsque vous envoyez un message qui n'est pas une réponse à un message reçu d'un autre service, utilisez le descripteur de conversation retourné par l'instruction BEGIN DIALOG qui a créé la conversation ;

  • lorsque vous envoyez un message qui est une réponse à un message reçu précédemment d'un autre service, utilisez le descripteur de conversation retourné par l'instruction RECEIVE qui a retourné le message d'origine.

Dans de nombreux cas, le code qui contient l'instruction SEND est distinct du code qui contient l'instruction BEGIN DIALOG ou RECEIVE qui fournit le descripteur de conversation. Dans ces cas, le descripteur de conversation doit être l'un des éléments de données inclus dans les informations d'état passées au code qui contient l'instruction SEND.

Les messages qui sont envoyés à un service dans une autre instance du Moteur de base de données SQL Server sont stockés dans une file d'attente de transmission dans la base de données actuelle jusqu'à ce qu'ils puissent être transmis à la file d'attente du service dans l'instance distante. Les messages envoyés à un service dans la même instance du Moteur de base de données sont placés directement dans la file d'attente associée à ce service. Si une condition empêche un message local d'être placé directement dans la file d'attente du service de destination, il peut être stocké dans la file d'attente de transmission jusqu'à ce que la condition soit résolue. Cela peut se produire, par exemple, pour certains types d'erreurs ou lorsque la file d'attente du service de destination est inactive. Vous pouvez utiliser la vue système sys.transmission_queue pour consulter les messages dans une file d'attente de transmission.

Les messages dans les files d'attente de transmission d'une instance sont transmis dans un ordre défini selon les critères suivants :

  • Le niveau de priorité du point de terminaison de leur conversation associée.

  • dans un même niveau de priorité, leur ordre d'envoi dans la conversation.

Les niveaux de priorité spécifiés dans les priorités de conversation ne sont appliqués aux messages dans la file d'attente de transmission que si l'option de base de données HONOR_BROKER_PRIORITY a la valeur ON. Si HONOR_BROKER_PRIORITY a la valeur OFF, le niveau de priorité par défaut 5 est attribué à tous les messages placés dans la file d'attente de transmission pour cette base de données. Les niveaux de priorité ne sont pas appliqués à une instruction SEND dans laquelle les messages sont placés directement dans une file d'attente de service dans la même instance du Moteur de base de données.

L'instruction SEND verrouille le descripteur de conversation et non le groupe auquel appartient le descripteur.

L'instruction SEND n'est pas valide dans une fonction définie par l'utilisateur.

Autorisations

Pour envoyer un message, l'utilisateur actuel doit disposer d'une autorisation SEND pour le service dont provient le dialogue. S'il existe une liaison de service distant, l'utilisateur spécifié dans celle-ci doit disposer d'autorisations RECEIVE sur la file d'attente pour le service dont provient le dialogue.

Exemple

L'exemple ci-dessous illustre le début d'un dialogue et l'envoi d'un message XML dans le cadre du dialogue. Pour envoyer le message, l'exemple convertit l'objet xml au format 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) ;