Sintaxe de ação SQL da regra de assinatura
Uma ação SQL é usada para manipular metadados de mensagem depois que uma mensagem é selecionada por um filtro de uma regra de assinatura. É uma expressão de texto que se apoia em um subconjunto do padrão SQL-92. As expressões de ação são usadas com o sqlExpression
elemento da propriedade 'action' de um Service Bus Rule
em um modelo do Azure Resource Manager ou o argumento do comando da CLI az servicebus topic subscription rule create
do --action-sql-expression
Azure e várias funções do SDK que permitem gerenciar regras de assinatura.
<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>
é uma cadeia de caracteres opcional que indica o escopo do<property_name>
. Os valores válidos sãosys
ouuser
.- O
sys
valor indica o escopo do sistema, onde<property_name>
está qualquer uma das propriedades na mensagem do Service Bus, conforme descrito em Mensagens, cargas úteis e serialização. - O
user
valor indica o escopo do usuário onde<property_name>
é uma chave das propriedades personalizadas que você pode definir na mensagem ao enviar para o Service Bus. - O
user
escopo é o escopo padrão se<scope>
não for especificado.
- O
Observações
Uma tentativa de acessar uma propriedade de sistema inexistente é um erro, enquanto uma tentativa de acessar uma propriedade de usuário inexistente não é um erro. Em vez disso, uma propriedade de usuário inexistente é avaliada internamente como um valor desconhecido. Um valor desconhecido é tratado especialmente durante a avaliação do operador.
property_name
<property_name> ::=
<identifier>
| <delimited_identifier>
<identifier> ::=
<regular_identifier> | <quoted_identifier> | <delimited_identifier>
Argumentos
<regular_identifier>
é uma cadeia de caracteres representada pela seguinte expressão regular:
[[:IsLetter:]][_[:IsLetter:][:IsDigit:]]*
Significa qualquer cadeia de caracteres que começa com uma letra e é seguida por um ou mais sublinhados/letras/dígitos.
[:IsLetter:]
significa qualquer caractere Unicode que é categorizado como uma letra Unicode. System.Char.IsLetter(c)
retorna true
se c
é uma letra Unicode.
[:IsDigit:]
significa qualquer caractere Unicode categorizado como um dígito decimal. System.Char.IsDigit(c)
retorna true
se c
for um dígito Unicode.
A <regular_identifier>
não pode ser uma palavra-chave reservada.
<delimited_identifier>
é qualquer cadeia de caracteres entre colchetes esquerdo/direito ([]). Um colchete direito é representado como dois colchetes direitos. Seguem-se exemplos de <delimited_identifier>
:
[Property With Space]
[HR-EmployeeID]
<quoted_identifier>
é qualquer cadeia de caracteres entre aspas duplas. Uma aspa dupla no identificador é representada como duas aspas duplas. Não é recomendado usar identificadores entre aspas porque pode ser facilmente confundido com uma constante de cadeia de caracteres. Use um identificador delimitado, se possível. Aqui está um exemplo de <quoted_identifier>
:
"Contoso & Northwind"
Padrão
<pattern> ::=
<expression>
Observações
<pattern>
deve ser uma expressão avaliada como uma cadeia de caracteres. É usado como um padrão para o operador LIKE. Ele pode conter os seguintes caracteres curinga:
%
: Qualquer cadeia de caracteres de zero ou mais caracteres._
: Qualquer caractere único.
escape_char
<escape_char> ::=
<expression>
Observações
<escape_char>
deve ser uma expressão avaliada como uma cadeia de caracteres de comprimento 1. É usado como um personagem de escape para o operador LIKE.
Por exemplo, property LIKE 'ABC\%' ESCAPE '\'
corresponde ABC%
em vez de uma cadeia de caracteres que começa com ABC
.
Constante
<constant> ::=
<integer_constant> | <decimal_constant> | <approximate_number_constant> | <boolean_constant> | NULL
Argumentos
<integer_constant>
é uma cadeia de números que não estão entre aspas e não contêm pontos decimais. Os valores são armazenados internamenteSystem.Int64
e seguem o mesmo intervalo.Seguem-se exemplos de constantes longas:
1894 2
<decimal_constant>
é uma cadeia de números que não estão entre aspas e contêm um ponto decimal. Os valores são armazenados internamenteSystem.Double
e seguem o mesmo intervalo/precisão.Em uma versão futura, esse número pode ser armazenado em um tipo de dados diferente para oferecer suporte à semântica de número exato, portanto, você não deve confiar no fato de que o tipo de dados subjacente é
System.Double
para<decimal_constant>
.Seguem-se exemplos de constantes decimais:
1894.1204 2.0
<approximate_number_constant>
é um número escrito em notação científica. Os valores são armazenados internamenteSystem.Double
e seguem o mesmo intervalo/precisão. Seguem-se exemplos de constantes numéricas aproximadas:101.5E5 0.5E-2
boolean_constant
<boolean_constant> :=
TRUE | FALSE
Observações
As constantes booleanas são representadas pelas palavras-chave TRUE
ou FALSE
. Os valores são armazenados como System.Boolean
.
string_constant
<string_constant>
Observações
As constantes de cadeia de caracteres são colocadas entre aspas simples e incluem todos os caracteres Unicode válidos. Uma única aspa incorporada em uma constante de cadeia de caracteres é representada como duas aspas simples.
Function
<function> :=
newid() |
property(name) | p(name)
Atualmente, newid()
e property(name)
são as únicas funções suportadas.
Observações
- A
newid()
função retorna umSystem.Guid
gerado peloSystem.Guid.NewGuid()
método. - A
property(name)
função retorna o valor da propriedade referenciada porname
. Oname
valor pode ser qualquer expressão válida que retorna um valor de cadeia de caracteres.
Exemplos
Para obter exemplos, consulte Exemplos de filtro do Service Bus.
Considerações
- SET é usado para criar uma nova propriedade ou atualizar o valor de uma propriedade existente.
- REMOVE é usado para remover uma propriedade de usuário. Somente as propriedades do usuário podem ser removidas, não as propriedades do sistema.
- SET executa a conversão implícita, se possível, quando o tipo de expressão e o tipo de propriedade existente são diferentes.
- A ação falhará se propriedades do sistema inexistentes forem referenciadas.
- A ação não falhará se propriedades de usuário inexistentes forem referenciadas.
- Uma propriedade de usuário inexistente é avaliada como "Unknown" internamente, seguindo a mesma semântica de SQLRuleFilter ao avaliar operadores.
Pontos importantes
Aqui estão alguns pontos importantes:
- Somente as propriedades de uma mensagem podem ser modificadas.
- Todas as propriedades do usuário podem ser modificadas.
- Todas as propriedades do sistema atualizáveis publicamente também podem ser modificadas, como
ReplyTo
eCorrelationId
, mas recomendamos que você não altere as propriedades do sistema como parte de uma ação de regra. Ainda é permitido por motivos de compatibilidade com versões anteriores. - Ao definir propriedades, apenas literais numéricos, booleanos e de cadeia de caracteres são permitidos. Um literal de cadeia de caracteres, por sua vez, é convertido em um tipo com base na propriedade que está sendo modificada. Se a propriedade que está sendo definida ainda não existir, não haverá conversão de tipo de string. Se a propriedade que está sendo modificada já existe e seu valor é um desses tipos
Guid
, ,DateTimeOffset
,TimeSpan
Uri
,DateTime
, então o literal de cadeia de caracteres é convertido para esse tipo e definido como o valor da propriedade. Para ser mais específico, a ação tenta converter a cadeia de caracteres literal para o tipo de propriedade. Se for bem-sucedido, a propriedade será definida. Caso contrário, a avaliação da ação da regra lançará uma exceção e a mensagem será escrita em letra morta.