Синтаксис действия SQL для правил подписки

Действие SQL используется для работы с метаданными сообщений после выбора сообщения фильтром правила подписки. Это текстовое выражение, которое является эффективным для подмножества стандарта SQL-92. Выражения действий используются с sqlExpressionэлементом свойства действия в служебной шинеRule в шаблоне Azure Resource Managerили в аргументе команды az servicebus topic subscription rule create Azure CLI --action-sql-expression, а также нескольких функциях пакета SDK, которые позволяют управлять правилами подписки.

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

Аргументы

  • <scope> — необязательная строка, указывающая область <property_name>. Допустимые значения — sys или user.
    • Значение sys указывает системную область, где <property_name> — любое из свойств сообщения служебной шины, как описано в разделе Сообщения, полезные данные и сериализация.
    • Значение user указывает на область действия пользователя, где <property_name> — это ключ нAstraиваемых свойств, которые можно задать для сообщения при отправке в служебную шину.
    • Область user является областью по умолчанию, если значение <scope> не указано.

Замечания

Попытка доступа к несуществующему системном свойству является ошибкой, а попытка доступа к несуществующему свойству пользователя не является ошибкой. Вместо этого несуществующее свойство пользователя внутренне оценивается как неизвестное значение. Неизвестное значение обрабатывается особым образом во время вычисления оператора.

property_name

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

Аргументы

<regular_identifier> — строка, представленная следующим регулярным выражением:

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

Это означает любую строку, которая начинается с буквы и следует одна или несколько символов подчеркивания/ буквы или цифры.

[:IsLetter:] — любой символ Юникода, который относится к категории букв Юникода. System.Char.IsLetter(c) возвращает значение true, если c является буквой Юникода.

[:IsDigit:] — любой символ Юникода, который относится к категории десятичных цифр. System.Char.IsDigit(c) возвращает значение true, если c является цифрой Юникода.

<regular_identifier> не может быть зарезервированным ключевым словом.

<delimited_identifier> — любая строка, заключенная в квадратные скобки ([]). Закрывающая квадратная скобка представляется в виде двух закрывающих квадратных скобок. Ниже приведены примеры <delimited_identifier>.

[Property With Space]  
[HR-EmployeeID]  
  

<quoted_identifier> — любая строка, заключенная в двойные кавычки. Двойные кавычки в идентификаторе представляются в виде двух пар двойных кавычек. Мы не рекомендуем использовать заключенные в кавычки идентификаторы, так как их можно легко спутать со строковой константой. По возможности используйте идентификаторы с разделителем. Ниже приведен пример <quoted_identifier>.

"Contoso & Northwind"  

Расписание

<pattern> ::=  
      <expression>  

Замечания

Свойство <pattern> должно быть выражением, которое будет вычисляться как строка. Оно используется в качестве шаблона для оператора LIKE. Оно может содержать следующие подстановочные знаки:

  • % — любая строка, содержащая ноль или более символов.
  • _ — любой один символ.

escape_char

<escape_char> ::=  
      <expression>  

Замечания

Свойство <escape_char> должно быть выражением, которое будет вычисляться в качестве строки с 1 символом. Оно используется в качестве escape-символа для оператора LIKE.

Например, property LIKE 'ABC\%' ESCAPE '\' соответствует ABC%, а не строке, начинающейся с ABC.

Константа

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

Аргументы

  • <integer_constant> — строка чисел без кавычек и десятичного разделителя. Значения хранятся в виде System.Int64 внутри системы и попадают в тот же диапазон.

    Ниже приведены примеры длинных констант.

    1894  
    2  
    
  • <decimal_constant> — строка чисел без кавычек и с десятичным разделителем. Значения хранятся в виде System.Double внутри системы и попадают в тот же диапазон и точность.

    В следующих версиях это число может храниться в другом типе данных для обеспечения поддержки более точной числовой семантики. Поэтому не следует полагаться на тот факт, что базовым типом данных для <decimal_constant> является System.Double.

    Ниже приведены примеры констант типа decimal.

    1894.1204  
    2.0  
    
  • <approximate_number_constant> — число, записанное в экспоненциальном представлении чисел. Значения хранятся в виде System.Double внутри системы и попадают в тот же диапазон и точность. Ниже приведены примеры констант с приближенными числами.

    101.5E5  
    0.5E-2  
    

boolean_constant

<boolean_constant> :=  
      TRUE | FALSE  

Замечания

Логические константы представлены в виде ключевого слова TRUE или FALSE. Значения хранятся в виде System.Boolean.

string_constant

<string_constant>  

Замечания

Строковые константы заключаются в одинарные кавычки и включают любые допустимые символы Юникода. Одинарная кавычка, внедренная в строковую константу, представляется в виде двух одинарных кавычек.

Функция

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

newid() В настоящее время и property(name) являются единственными поддерживаемыми функциями.

Замечания

  • Функция newid() возвращает значение System.Guid, созданное методом System.Guid.NewGuid().
  • Функция property(name) возвращает значение свойства, на которое указывает name. В качестве значения name может использоваться любое допустимое выражение, возвращающее строковое значение.

Примеры

Примеры см. в разделе Примеры фильтров служебной шины.

Рекомендации

  • Оператор SET используется для создания свойства или обновления значения имеющегося свойства.
  • REMOVE используется для удаления свойства пользователя. Удалить можно только свойства пользователей, а не системные свойства.
  • По возможности оператор SET выполняет неявное преобразование, если тип выражения и тип имеющегося свойства отличаются.
  • Действие завершается ошибкой, если неисключающие системные свойства ссылаются.
  • Действие не завершается ошибкой, если на несуществующие свойства пользователя ссылаются.
  • Несуществующее свойство пользователя оценивается как "Неизвестно" внутренне, следуя той же семантике, что и SQLRuleFilter при оценке операторов.

Важные аспекты

Ниже приведены некоторые важные замечания.

  • Можно изменить только свойства сообщения.
  • Все свойства пользователя можно изменить.
  • Все общедоступные системные свойства также могут быть изменены, например ReplyTo и CorreationId, но рекомендуется не изменять системные свойства в рамках действия правила. Это по-прежнему разрешено по соображениям обратной совместимости.
  • При задании свойств разрешены только числовые, логические и строковые литералы. Строковый литерал, в свою очередь, преобразуется в тип на основе изменяемого свойства. Если заданное свойство еще не существует, преобразование типов из строки отсутствует. Если измененное свойство уже существует и его значение является одним из этих типов Guid, DateTimeOffset, TimeSpan, Uri, то DateTimeстроковый литерал преобразуется в этот тип и задает значение свойства. Чтобы быть более конкретным, действие пытается преобразовать строковый литерал в тип свойства. Если это успешно, свойство задано. В противном случае оценка действия правила создает исключение, и сообщение является недоставленным.

Следующие шаги