Синтаксис действия 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
<function> :=
newid() |
property(name) | p(name)
newid()
В настоящее время и property(name)
являются единственными поддерживаемыми функциями.
Замечания
- Функция
newid()
возвращает значениеSystem.Guid
, созданное методомSystem.Guid.NewGuid()
. - Функция
property(name)
возвращает значение свойства, на которое указываетname
. В качестве значенияname
может использоваться любое допустимое выражение, возвращающее строковое значение.
Примеры
Примеры см. в разделе Примеры фильтров служебной шины.
Рекомендации
- Оператор SET используется для создания свойства или обновления значения имеющегося свойства.
- REMOVE используется для удаления свойства пользователя. Удалить можно только свойства пользователей, а не системные свойства.
- По возможности оператор SET выполняет неявное преобразование, если тип выражения и тип имеющегося свойства отличаются.
- Действие завершается ошибкой, если неисключающие системные свойства ссылаются.
- Действие не завершается ошибкой, если на несуществующие свойства пользователя ссылаются.
- Несуществующее свойство пользователя оценивается как "Неизвестно" внутренне, следуя той же семантике, что и SQLRuleFilter при оценке операторов.
Важные аспекты
Ниже приведены некоторые важные замечания.
- Можно изменить только свойства сообщения.
- Все свойства пользователя можно изменить.
- Все общедоступные системные свойства также могут быть изменены, например
ReplyTo
иCorrelationId
, но рекомендуется не изменять системные свойства в рамках действия правила. Это по-прежнему разрешено по соображениям обратной совместимости. - При задании свойств разрешены только числовые, логические и строковые литералы. Строковый литерал, в свою очередь, преобразуется в тип на основе изменяемого свойства. Если заданное свойство еще не существует, преобразование типов из строки отсутствует. Если измененное свойство уже существует и его значение является одним из этих типов
Guid
,DateTimeOffset
,TimeSpan
,Uri
, тоDateTime
строковый литерал преобразуется в этот тип и задает значение свойства. Чтобы быть более конкретным, действие пытается преобразовать строковый литерал в тип свойства. Если это успешно, свойство задано. В противном случае оценка действия правила создает исключение, и сообщение является недоставленным.