Проверить идентификатор (параметр) MSSQL в .NET или регулярном выражении

В проекте .NET мне нужно проверить, является ли строка допустимым идентификатором параметра Microsoft SQL Server 2005.

Пример: SELECT * FROM table WHERE column = @parameter

Существует ли метод класса среды выполнения для проверки строки на предмет того, что она является параметром, или есть регулярное выражение, которое проверяет правила? (см. ниже)

Из документации по идентификаторам параметры должны соответствовать к этим общим правилам идентификаторов:

  1. Первый символ должен быть одним из следующих: * Буква, как определено в стандарте Unicode 3.2. Определение букв Unicode включает латинские символы от a до z, от A до Z, а также буквенные символы из других языков. * Подчеркивание (_), знак at (@) или цифровой знак (#).
    Некоторые символы в начале идентификатора имеют особое значение в SQL Server. Обычный идентификатор, который начинается со знака at, всегда обозначает локальную переменную или параметр и не может использоваться в качестве имени любого другого типа объекта. Идентификатор, который начинается со знака числа, обозначает временную таблицу или процедуру. Идентификатор, который начинается с двойных цифровых знаков (##), обозначает глобальный временный объект. Несмотря на то, что символы знака числа или знака двойного числа могут использоваться в начале имен объектов других типов, мы не рекомендуем это делать. Некоторые функции Transact-SQL имеют имена, начинающиеся с двойных знаков (@@). Чтобы избежать путаницы с этими функциями, не следует использовать имена, начинающиеся с @@.
  2. Последующие символы могут включать следующее: * Буквы, как определено в стандарте Unicode 3.2. * Десятичные числа из базовой латыни или других национальных алфавитов. * Знак «at», знак доллара ($), знак числа или подчеркивание.
  3. Идентификатор не должен быть зарезервированным словом Transact-SQL. SQL Server резервирует зарезервированные слова как в верхнем, так и в нижнем регистре.
  4. Встроенные пробелы или специальные символы не допускаются.
  5. Дополнительные символы не допускаются.

Когда идентификаторы используются в операторах Transact-SQL, идентификаторы, не соответствующие этим правилам, должны быть разделены двойными кавычками или скобками.

Поскольку я хочу проверять только параметры, идентификаторы должны начинаться со знака @ и не должны быть разделены.


person Bart Verkoeijen    schedule 22.04.2009    source источник
comment
Вы пытаетесь разобрать SQL из какого-либо приложения или хотите после этого запустить инструкцию SQL?   -  person gbn    schedule 22.04.2009


Ответы (2)


Я наткнулся на классы символов Unicode, но как только я узнал, что они поддерживаются в регулярных выражениях .NET, я придумал следующее регулярное выражение, решающее мой вопрос:

@[\p{L}{\p{Nd}}$#_][\p{L}{\p{Nd}}@$#_]*

Это заставляет:

  • Идентификатор всегда начинается с @, что делает его параметром.
  • Отсутствие @ во второй позиции позволяет избежать путаницы со специальными функциями TSQL.
  • Допускает только символы, определенные в правилах.
person Bart Verkoeijen    schedule 22.04.2009
comment
+1, но я хотел бы отметить, что @@identifiers не поддерживаются этим регулярным выражением. @BartVerkoeijen указал на свои рассуждения, но должно быть ясно, что даже если их можно спутать со специальными функциями TSQL, на самом деле они являются действительными идентификаторами. Регулярное выражение, точно соответствующее спецификации, будет @[\p{L}\p{Nd}@$#_]+ - person LunicLynx; 18.01.2017
comment
@LunicLynx Это позволит использовать несколько @ в любом месте идентификатора. Если это сделано намеренно, то отлично :-) Если вы хотите разрешить один или два @ символа только в начале, подумайте о том, чтобы начать регулярное выражение с @@? вместо включения @ в класс символов. - person Jonathan Gilbert; 22.02.2019