Syntaxe d’action SQL pour les règles d’abonnement
Une action SQL permet de manipuler les métadonnées d’un message après qu’un message a été sélectionné par un filtre d’une règle d’abonnement. Il s’agit d’une expression textuelle qui s’appuie sur un sous-ensemble de la norme SQL-92. Les expressions d’action sont utilisées avec l’élément sqlExpression
de la propriété « action » d’un objet Rule
Service Bus dans un modèle Azure Resource Manager, avec l’argument --action-sql-expression
de la commande Azure CLI az servicebus topic subscription rule create
et avec plusieurs fonctions de Kit de développement logiciel (SDK) qui autorisent la gestion des règles d’abonnement.
<statements> ::=
<statement> [, ...n]
<statement> ::=
<action> [;]
Remarks
-------
Semicolon is optional.
<action> ::=
SET <property> = <expression>
REMOVE <property>
<expression> ::=
<constant>
| <function>
| <property>
| <expression> { + | - | * | / | % } <expression>
| { + | - } <expression>
| ( <expression> )
<property> :=
[<scope> .] <property_name>
Arguments
<scope>
est une chaîne facultative qui indique la portée de<property_name>
. Les valeurs valides sontsys
ouuser
.- La valeur
sys
indique l’étendue du système où<property_name>
est l’une des propriétés sur le message Service Bus, comme décrit dans Messages, charges utiles et sérialisation. - La valeur
user
indique l’étendue utilisateur, où<property_name>
est une clé des propriétés personnalisées que vous pouvez définir sur le message lors d’un envoi à Service Bus. - L’étendue de
user
est l’étendue par défaut si<scope>
n’est pas spécifié.
- La valeur
Notes
Une tentative d’accès à une propriété système inexistante est une erreur, tandis qu’une tentative d’accès à une propriété utilisateur inexistante n’en est pas une. Au lieu de cela, une propriété d’utilisateur inexistante est évaluée en interne en tant que valeur inconnue. Une valeur inconnue est traitée spécialement lors de l’évaluation de l’opérateur.
property_name
<property_name> ::=
<identifier>
| <delimited_identifier>
<identifier> ::=
<regular_identifier> | <quoted_identifier> | <delimited_identifier>
Arguments
<regular_identifier>
est une chaîne est représentée par l’expression régulière suivante :
[[:IsLetter:]][_[:IsLetter:][:IsDigit:]]*
Cela signifie toute chaîne commençant par une lettre et suivie par un(e) ou plusieurs traits de soulignement/lettres/chiffres.
[:IsLetter:]
signifie tout caractère Unicode classé en tant que lettre Unicode. System.Char.IsLetter(c)
renvoie true
si c
est une lettre Unicode.
[:IsDigit:]
signifie tout caractère Unicode classé en tant que chiffre décimal. System.Char.IsDigit(c)
renvoie true
si c
est un chiffre Unicode.
Un <regular_identifier>
ne peut pas être un mot clé réservé.
<delimited_identifier>
correspond à toute chaîne placée entre crochets ([]). Un crochet droit est représenté par deux crochets droits. Voici quelques exemples de <delimited_identifier>
:
[Property With Space]
[HR-EmployeeID]
<quoted_identifier>
correspond à toute chaîne placée entre guillemets doubles. Un guillemet double dans l’identificateur est représenté par deux guillemets doubles. Il est déconseillé d’utiliser des identificateurs entre guillemets, qui peuvent être facilement confondus avec une constante de chaîne. Utilisez si possible un identificateur délimité. Voici un exemple de <quoted_identifier>
:
"Contoso & Northwind"
Modèle
<pattern> ::=
<expression>
Remarques
<pattern>
doit être une expression évaluée comme chaîne. Il est utilisé comme modèle pour l’opérateur LIKE. Il peut contenir les caractères génériques suivants :
%
: Une chaîne de zéro ou plusieurs caractères._
: n’importe quel caractère unique.
escape_char
<escape_char> ::=
<expression>
Remarques
<escape_char>
doit être une expression évaluée comme chaîne dont la longueur est 1. Il est utilisé comme caractère d’échappement pour l’opérateur LIKE.
Par exemple, property LIKE 'ABC\%' ESCAPE '\'
correspond à ABC%
au lieu d’une chaîne qui commence par ABC
.
Constant
<constant> ::=
<integer_constant> | <decimal_constant> | <approximate_number_constant> | <boolean_constant> | NULL
Arguments
<integer_constant>
est une chaîne de nombres qui n’est pas entourée de guillemets et ne contient pas de décimales. Les valeurs sont stockées en tant queSystem.Int64
en interne et suivent la même plage.Voici quelques exemples de constantes longues :
1894 2
<decimal_constant>
est une chaîne de nombres qui n’est pas entourée de guillemets et qui contient une décimale. Les valeurs sont stockées en tant queSystem.Double
en interne et suivent la même plage/précision.Dans une version ultérieure, ce nombre pourrait être stocké dans un autre type de données pour prendre en charge la sémantique exacte des nombres. Vous n’aurez donc pas à compter sur le fait que le type de données sous-jacent soit
System.Double
pour<decimal_constant>
.Voici quelques exemples de constantes décimales :
1894.1204 2.0
<approximate_number_constant>
est un nombre écrit de manière scientifique. Les valeurs sont stockées en tant queSystem.Double
en interne et suivent la même plage/précision. Voici des exemples de constantes numériques approximatives :101.5E5 0.5E-2
boolean_constant
<boolean_constant> :=
TRUE | FALSE
Remarques
Les constantes booléennes sont représentées par les mots clés TRUE
ou FALSE
. Les valeurs sont stockées en tant que System.Boolean
.
string_constant
<string_constant>
Remarques
Les constantes de chaîne sont placées entre guillemets simples et incluent tout caractère Unicode valide. Un guillemet simple intégré à une constante de chaîne est représenté par deux guillemets simples.
Fonction
<function> :=
newid() |
property(name) | p(name)
Actuellement, newid()
et property(name)
sont les seules fonctions prises en charge.
Notes
- La fonction
newid()
renvoie unSystem.Guid
généré par la méthodeSystem.Guid.NewGuid()
. - La fonction
property(name)
renvoie la valeur de la propriété référencée parname
. La valeurname
peut être toute expression valide renvoyant une valeur de chaîne.
Exemples
Pour obtenir des exemples, consultez Exemples de filtres Service Bus.
Considérations
- SET est utilisé pour créer une nouvelle propriété ou mettre à jour la valeur d’une propriété existante.
- SUPPRIMER permet de supprimer une propriété utilisateur. Seules les propriétés utilisateur peuvent être supprimées, pas les propriétés système.
- SET effectue si possible une conversion implicite lorsque le type d’expression et le type de propriété existant sont différents.
- L’action échoue s’il est fait référence à des propriétés de système inexistantes.
- L’action réussit s’il est fait référence à des propriétés d’utilisateur inexistantes.
- Une propriété d’utilisateur inexistante est évaluée comme « Inconnue » en interne, suivant la même sémantique que SQLRuleFilter lors de l’évaluation des opérateurs.
Points importants
Voici quelques points importants :
- Seules les propriétés d’un message peuvent être modifiées.
- Toutes les propriétés utilisateur peuvent être modifiées.
- Toutes les propriétés système pouvant être mises à jour publiquement peuvent également être modifiées, comme
ReplyTo
etCorreationId
, mais nous vous recommandons de ne pas modifier les propriétés système dans le cadre d’une action de règle. Cela reste autorisé pour des raisons de compatibilité descendante. - Lorsque vous définissez des propriétés, seuls les littéraux de chaîne, numériques et booléens sont autorisés. Un littéral de chaîne est converti en type en fonction de la propriété en cours de modification. Si la propriété à définir n’existe pas encore, il n’y a pas de conversion de type à partir de la chaîne. Si la propriété en cours de modification existe déjà et que sa valeur est l’un de ces types :
Guid
,DateTimeOffset
,TimeSpan
,Uri
ouDateTime
; le littéral de chaîne est converti en ce type et défini comme valeur de propriété. Pour être plus spécifique, l’action tente de convertir le littéral de chaîne en type de propriété. Si elle réussit, la propriété est définie. Sinon, l’évaluation de l’action de règle lève une exception et le message est en lettres mortes.