Compartir vía


Sintaxis de acciones de SQL de regla de suscripción

Una acción de SQL se usa para manipular metadatos de mensajes después de que un filtro de una regla de suscripción haya seleccionado un mensaje. Es una expresión de texto que depende de un subconjunto del estándar SQL-92. Las expresiones de acción se usan con el elemento sqlExpression de la propiedad "action" de una Rule de Service Bus en una plantilla de Resource Manager, o con el argumento --action-sql-expression del comando az servicebus topic subscription rule create de la CLI de Azure y varias funciones de SDK que permiten administrar reglas de suscripción.

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

Argumentos

  • <scope> es una cadena opcional que indica el ámbito de <property_name>. Los valores válidos son sys y user.
    • El valor sys indica el ámbito del sistema, donde <property_name> es cualquiera de las propiedades del mensaje de Service Bus, como se describe en Mensajes, cargas y serialización.
    • El valor user indica el ámbito de usuario, donde <property_name> es una clave de las propiedades personalizadas que puede establecer en el mensaje al enviarlo a Service Bus.
    • El ámbito user es el predeterminado si no se especifica <scope>.

Comentarios

Un intento de acceso a una propiedad de sistema que no existe es un error, mientras que uno a una propiedad de usuario inexistente, no lo es. En su lugar, una propiedad de usuario inexistente internamente se evalúa como un valor desconocido. Un valor desconocido se trata de una forma especial durante la evaluación de operador.

property_name

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

Argumentos

<regular_identifier> es una cadena que se representa mediante la siguiente expresión regular:

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

Significa cualquier cadena que comience con una letra y vaya seguida de uno o más caracteres de subrayado/letra/dígito.

[:IsLetter:] significa cualquier carácter Unicode que se clasifica como una letra Unicode. System.Char.IsLetter(c) devuelve true si c es una letra Unicode.

[:IsDigit:] significa cualquier carácter Unicode que se clasifica como un dígito Unicode. System.Char.IsDigit(c) devuelve true si c es un dígito Unicode.

<regular_identifier> no puede ser una palabra clave reservada.

<delimited_identifier> es cualquier cadena que se incluye con corchetes izquierdos y derechos ([]). Un corchete derecho se representan como dos corchetes derechos. A continuación, se muestran ejemplos de <delimited_identifier>:

[Property With Space]  
[HR-EmployeeID]  
  

<quoted_identifier> es cualquier cadena que se incluye entre comillas dobles. Las comillas dobles en el identificador se representan como dos comillas dobles. No se recomienda usar identificadores entre comillas, ya que pueden confundirse fácilmente con una constante de cadena. Si es posible, utilice un identificador delimitado. Este es un ejemplo de <quoted_identifier>:

"Contoso & Northwind"  

Patrón

<pattern> ::=  
      <expression>  

Comentarios

<pattern> debe ser una expresión que se evalúa como una cadena. Se usa como patrón para el operador LIKE. Puede contener los siguientes caracteres comodín:

  • %:Cualquier cadena de cero o más caracteres.
  • _: cualquier carácter individual.

escape_char

<escape_char> ::=  
      <expression>  

Comentarios

<escape_char> debe ser una expresión que se evalúa como una cadena de longitud 1. Se usa como carácter de escape para el operador LIKE.

Por ejemplo, property LIKE 'ABC\%' ESCAPE '\' coincide con ABC%, en lugar de con una cadena que comienza con ABC.

Constante

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

Argumentos

  • <integer_constant> es una cadena de números que no se incluye entre comillas y no contiene decimales. Los valores se almacenan como System.Int64 internamente y siguen el mismo intervalo.

    A continuación, se muestran ejemplos de constantes largas:

    1894  
    2  
    
  • <decimal_constant> es una cadena de números que no se incluye entre comillas y contiene un separador decimal. Los valores se almacenan como System.Double internamente y siguen el mismo intervalo o la misma precisión.

    En una versión futura, este número podría almacenarse en un tipo de datos diferente para admitir la semántica de número exacto. Por lo tanto, no debe confiar en el hecho de que el tipo de datos subyacente es System.Double en <decimal_constant>.

    A continuación, se muestran ejemplos de constantes decimales:

    1894.1204  
    2.0  
    
  • <approximate_number_constant> es un número escrito en la notación científica. Los valores se almacenan como System.Double internamente y siguen el mismo intervalo o la misma precisión. A continuación, se muestran ejemplos de constantes de número aproximado:

    101.5E5  
    0.5E-2  
    

boolean_constant

<boolean_constant> :=  
      TRUE | FALSE  

Comentarios

Las constantes booleanas se representan mediante las palabras clave TRUE o FALSE. Los valores se almacenan como System.Boolean.

string_constant

<string_constant>  

Comentarios

Las constantes de cadena se incluyen entre comillas simples y contienen caracteres Unicode válidos. Una comilla simple incrustada en una constante de cadena se representan como dos comillas simples.

Función

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

Actualmente, newid() y property(name) son las únicas funciones admitidas.

Comentarios

  • La función newid() devuelve un elemento System.Guid generado por el método System.Guid.NewGuid().
  • La función property(name) devuelve el valor de la propiedad a la que hace referencia name. El valor name puede ser cualquier expresión válida que devuelve un valor de cadena.

Ejemplos

Para obtener ejemplos, consulte Ejemplos de filtros de Service Bus.

Consideraciones

  • SET se usa para crear una nueva propiedad o actualizar el valor de una propiedad existente.
  • REMOVE se usa para quitar una propiedad de usuario. Solo se pueden quitar las propiedades de usuario, no las propiedades del sistema.
  • SET realiza la conversión implícita si es posible cuando el tipo de expresión y el tipo de propiedad existentes son diferentes.
  • La acción no se realiza correctamente si se hace referencia a propiedades del sistema inexistentes.
  • La acción no se realiza correctamente si se hace referencia a propiedades del usuario inexistentes.
  • Una propiedad de usuario inexistente se evalúa como desconocida internamente siguiendo la misma semántica que SQLRuleFilter al evaluar los operadores.

Observaciones importantes

Estos son algunos puntos importantes:

  • Solo se pueden modificar las propiedades de un mensaje.
  • Todas las propiedades de usuario se pueden modificar.
  • Todas las propiedades del sistema actualizables públicamente también se pueden modificar, como ReplyTo y CorreationId, pero se recomienda no modificar las propiedades del sistema como parte de una acción de regla. Todavía se permite por motivos de compatibilidad con versiones anteriores.
  • Al establecer propiedades, solo se permiten literales numéricos, booleanos y de cadena. A su vez, un literal de cadena se convierte en un tipo basado en la propiedad que se va a modificar. Si la propiedad que se establece aún no existe, no hay ninguna conversión de tipos de cadena. Si la propiedad que se va a modificar ya existe y su valor es uno de los tipos Guid, DateTimeOffset, TimeSpan, Uri o DateTime, el literal de cadena se convierte en ese tipo y se establece como valor de propiedad. Para ser más específico, la acción intenta convertir el literal de cadena al tipo de propiedad. Si se realiza correctamente, se establece la propiedad. De lo contrario, la evaluación de la acción de regla produce una excepción y el mensaje falla.

Pasos siguientes