Sql-åtgärdssyntax för prenumerationsregel

En SQL-åtgärd används för att manipulera meddelandemetadata när ett meddelande har valts av ett filter för en prenumerationsregel. Det är ett textuttryck som lutar sig mot en delmängd av SQL-92-standarden. Åtgärdsuttryck används med elementet sqlExpression i egenskapen "action" för en Service Bus Rule i en Azure Resource Manager-mall, eller Azure CLI-kommandots az servicebus topic subscription rule create--action-sql-expression argument och flera SDK-funktioner som tillåter hantering av prenumerationsregler.

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

Argument

  • <scope> är en valfri sträng som anger omfånget för <property_name>. Giltig värden är sys och user.
    • Värdet sys anger systemomfånget där <property_name> är någon av egenskaperna i Service Bus-meddelandet enligt beskrivningen i Meddelanden, nyttolaster och serialisering.
    • Värdet user anger användaromfånget där <property_name> är en nyckel för de anpassade egenskaper som du kan ange för meddelandet när du skickar till Service Bus.
    • Omfånget user är standardomfånget om <scope> det inte har angetts.

Anmärkningar

Ett försök att komma åt en obefintlig systemegenskap är ett fel, medan ett försök att komma åt en icke-existerande användaregenskap inte är ett fel. I stället utvärderas en obefintlig användaregenskap internt som ett okänt värde. Ett okänt värde behandlas särskilt under operatorutvärderingen.

property_name

<property_name> ::=  
     <identifier>  
     | <delimited_identifier>  
  
<identifier> ::=  
     <regular_identifier> | <quoted_identifier> | <delimited_identifier>  
  

Argument

<regular_identifier> är en sträng som representeras av följande reguljära uttryck:

[[:IsLetter:]][_[:IsLetter:][:IsDigit:]]*  

Det innebär att alla strängar som börjar med en bokstav och följs av ett eller flera understreck/bokstäver/siffror.

[:IsLetter:] betyder alla Unicode-tecken som kategoriseras som en Unicode-bokstav. System.Char.IsLetter(c) returnerar true om c är en Unicode-bokstav.

[:IsDigit:] betyder alla Unicode-tecken som kategoriseras som en decimalsiffra. System.Char.IsDigit(c) returnerar true om c är en Unicode-siffra.

A <regular_identifier> kan inte vara ett reserverat nyckelord.

<delimited_identifier> är en sträng som omges av hakparenteser till vänster/höger ([]). En höger hakparentes representeras som två höger hakparenteser. Följande är exempel på <delimited_identifier>:

[Property With Space]  
[HR-EmployeeID]  
  

<quoted_identifier> är en sträng som omges av dubbla citattecken. Ett dubbelt citattecken i identifieraren representeras som två dubbla citattecken. Vi rekommenderar inte att du använder citerade identifierare eftersom det enkelt kan förväxlas med en strängkonstant. Använd en avgränsad identifierare om det är möjligt. Här är ett exempel på <quoted_identifier>:

"Contoso & Northwind"  

Mönster

<pattern> ::=  
      <expression>  

Anmärkningar

<pattern> måste vara ett uttryck som utvärderas som en sträng. Det används som ett mönster för LIKE-operatorn. Den kan innehålla följande jokertecken:

  • %: Valfri sträng med noll eller fler tecken.
  • _: Alla enskilda tecken.

escape_char

<escape_char> ::=  
      <expression>  

Anmärkningar

<escape_char> måste vara ett uttryck som utvärderas som en sträng med längd 1. Det används som ett escape-tecken för LIKE-operatorn.

Matchar till exempel property LIKE 'ABC\%' ESCAPE '\'ABC% i stället för en sträng som börjar med ABC.

Konstant

<constant> ::=  
      <integer_constant> | <decimal_constant> | <approximate_number_constant> | <boolean_constant> | NULL  

Argument

  • <integer_constant> är en sträng med tal som inte omges av citattecken och inte innehåller decimaltecken. Värdena lagras som System.Int64 internt och följer samma intervall.

    Följande är exempel på långa konstanter:

    1894  
    2  
    
  • <decimal_constant> är en sträng med tal som inte omges av citattecken och som innehåller en decimalpunkt. Värdena lagras som System.Double internt och följer samma intervall/precision.

    I en framtida version kan det här numret lagras i en annan datatyp för att stödja exakta talsemantik, så du bör inte förlita dig på det faktum att den underliggande datatypen är System.Double för <decimal_constant>.

    Följande är exempel på decimalkonstanter:

    1894.1204  
    2.0  
    
  • <approximate_number_constant> är ett tal skrivet i vetenskaplig notation. Värdena lagras som System.Double internt och följer samma intervall/precision. Följande är exempel på ungefärliga talkonstanter:

    101.5E5  
    0.5E-2  
    

boolean_constant

<boolean_constant> :=  
      TRUE | FALSE  

Anmärkningar

Booleska konstanter representeras av nyckelorden TRUE eller FALSE. Värdena lagras som System.Boolean.

string_constant

<string_constant>  

Anmärkningar

Strängkonstanter omges av enkla citattecken och innehåller alla giltiga Unicode-tecken. Ett enkelt citattecken som är inbäddat i en strängkonstant representeras som två enkla citattecken.

Function

<function> :=  
      newid() |  
      property(name) | p(name)  

newid() För närvarande och property(name) är de enda funktioner som stöds.

Anmärkningar

  • Funktionen newid() returnerar en System.Guid som genereras av System.Guid.NewGuid() metoden.
  • Funktionen property(name) returnerar värdet för egenskapen som refereras av name. Värdet name kan vara valfritt giltigt uttryck som returnerar ett strängvärde.

Exempel

Exempel finns i Service Bus-filterexempel.

Att tänka på

  • SET används för att skapa en ny egenskap eller uppdatera värdet för en befintlig egenskap.
  • REMOVE används för att ta bort en användaregenskap. Endast användaregenskaper kan tas bort, inte systemegenskaper.
  • SET utför implicit konvertering om möjligt när uttryckstypen och den befintliga egenskapstypen skiljer sig.
  • Åtgärden misslyckas om obefintliga systemegenskaper refererades.
  • Åtgärden misslyckas inte om inga icke-existerande användaregenskaper refererades till.
  • En icke-existerande användaregenskap utvärderas som "Okänd" internt och följer samma semantik som SQLRuleFilter vid utvärdering av operatorer.

Viktiga punkter

Här är några viktiga punkter:

  • Endast egenskaper för ett meddelande kan ändras.
  • Alla användaregenskaper kan ändras.
  • Alla offentligt uppdaterade systemegenskaper kan också ändras, till exempel ReplyTo och CorreationId, men vi rekommenderar att du inte ändrar systemegenskaper som en del av en regelåtgärd. Det tillåts fortfarande av bakåtkompatibilitetsskäl.
  • När du anger egenskaper tillåts endast numeriska, booleska och strängliteraler. En strängliteral konverteras i sin tur till en typ baserat på den egenskap som ändras. Om egenskapen som anges inte redan finns finns det ingen typkonvertering från strängen. Om egenskapen som ändras redan finns och dess värde är en av dessa typer Guid, , DateTimeOffsetTimeSpan, Uri, DateTime, konverteras strängliteralen till den typen och anges som egenskapsvärde. För att vara mer specifik försöker åtgärden konvertera strängliteralen till typen av egenskap. Om det lyckas anges egenskapen. Annars utlöser utvärderingen av regelåtgärden ett undantag och meddelandet är obeställt.

Nästa steg