Sintaxe do Filtro SQL da Regra de Subscrição
Um filtro SQL é um dos tipos de filtro disponíveis para assinaturas de tópico do Service Bus. É uma expressão de texto que se apoia em um subconjunto do padrão SQL-92. As expressões de filtro são usadas com o sqlExpression
elemento da propriedade 'sqlFilter' 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 Azure, e várias funções do --filter-sql-expression
SDK que permitem gerenciar regras de assinatura. As expressões permitidas são mostradas nesta seção.
O Service Bus Premium também suporta a sintaxe do seletor de mensagens JMS SQL por meio da API JMS 2.0.
<predicate ::=
{ NOT <predicate> }
| <predicate> AND <predicate>
| <predicate> OR <predicate>
| <expression> { = | <> | != | > | >= | < | <= } <expression>
| <property> IS [NOT] NULL
| <expression> [NOT] IN ( <expression> [, ...n] )
| <expression> [NOT] LIKE <pattern> [ESCAPE <escape_char>]
| EXISTS ( <property> )
| ( <predicate> )
<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:]]*
Esta gramática 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"
pattern
<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.Aqui estão 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)
Observações
A newid()
função retorna um System.Guid
gerado pelo System.Guid.NewGuid()
método.
A property(name)
função retorna o valor da propriedade referenciada por name
. O name
valor pode ser qualquer expressão válida que retorna um valor de cadeia de caracteres.
Considerações
Considere a seguinte semântica do Filtro SQL:
Os nomes de propriedade não diferenciam maiúsculas de minúsculas.
Os operadores seguem a semântica de conversão implícita em C# sempre que possível.
As propriedades do sistema são qualquer uma das propriedades na mensagem do Service Bus, conforme descrito em Mensagens, cargas úteis e serialização.
Considere a seguinte
IS [NOT] NULL
semântica:property IS NULL
é avaliado comotrue
se a propriedade não existisse ou o valor da propriedade fossenull
.
Semântica de avaliação de propriedades
Uma tentativa de avaliar uma propriedade de sistema inexistente gera uma
FilterException
exceção.Uma propriedade que não existe é avaliada internamente como desconhecida.
Avaliação desconhecida em operadores aritméticos:
Para operadores binários, se o lado esquerdo ou direito dos operandos for avaliado como desconhecido, o resultado será desconhecido.
Para operadores unários, se um operando é avaliado como desconhecido, o resultado é desconhecido.
Avaliação desconhecida em operadores de comparação binária:
Se o lado esquerdo ou direito dos operandos for avaliado como desconhecido, então o resultado é desconhecido.
Avaliação desconhecida em
[NOT] LIKE
:Se qualquer operando for avaliado como desconhecido, o resultado será desconhecido.
Avaliação desconhecida em
[NOT] IN
:Se o operando esquerdo for avaliado como desconhecido, o resultado será desconhecido.
Avaliação desconhecida no operador AND :
+---+---+---+---+
|AND| T | F | U |
+---+---+---+---+
| T | T | F | U |
+---+---+---+---+
| F | F | F | F |
+---+---+---+---+
| U | U | F | U |
+---+---+---+---+
Avaliação desconhecida no operador OR :
+---+---+---+---+
|OR | T | F | U |
+---+---+---+---+
| T | T | T | T |
+---+---+---+---+
| F | T | F | U |
+---+---+---+---+
| U | T | U | U |
+---+---+---+---+
Semântica de vinculação do operador
Os operadores de comparação como
>
, , , ,>=
<=
<
,!=
e seguem a mesma semântica que a ligação do operador C# em promoções de tipo de dados e=
conversões implícitas.Os operadores aritméticos como
+
, , ,-
*
,/
e seguem a mesma semântica que a ligação do operador C# em promoções de tipo de dados e%
conversões implícitas.
Exemplos
Para obter exemplos, consulte Exemplos de filtro do Service Bus.