Составные идентификаторы в Microsoft.SQLServer.TransactSQL.ScriptDom, которые не являются таблицами

#scriptdom

#scriptdom

Вопрос:

Я пытаюсь использовать Microsoft.SqlServer.TransactSql.ScriptDom для проверки того, что выражение является скалярной константой.

Вот такое выражение:

 DATEADD(YEAR, -21, CURRENT_TIMESTAMP)
 

Здесь нет такого выражения:

 DATEADD(YEAR, -21, DateOfBirth)
 

Это не константа, поскольку она ссылается на столбец DateOfBirth .
Как я могу это определить?

Чего я не ожидал — и почему я столкнулся с проблемами — это то, что Microsoft.SqlServer.TransactSql.ScriptDom думает, что YEAR это ColumnReferenceExpression .

Ответ №1:

(слишком долго для комментариев)

ScriptDom не компилируется, просто анализирует и обрабатывает все «странные имена» как возможные имена столбцов, например, в IF (MAGICNAME = 0) будет обнаружен «столбец» с именем MAGICNAME . Если вы хотите больше, вам нужно добавить больше интеллекта в этот процесс самостоятельно.

Это можно сделать, создав дополнительные классы visitor для использования в качестве вложенных анализаторов. И путем хранения списков «известных магических слов, относящихся к конкретным случаям». Что в данном случае может привести к коду, который:

  • улавливает udf
  • проверяет, является ли это одной из хорошо известных функций
  • вызывает вложенный класс visitor, который понимает больше об этой конкретной функции

При таком подходе конкретный посетитель DATEADD (или все функции обработки даты) Может иметь список слов YEAR MONTH и т. Д., Чтобы Изменить понимание первого аргумента с «возможного столбца» на «известное статическое магическое слово».

Данная задача вряд ли может быть выполнена в целом для любого возможного случая, однако, похоже, что многие случаи могут быть обработаны правильно. Идея состоит в том, чтобы реализовать подход «duck typing»:

  • обнаруживайте выражения, которые могут быть скалярными и «постоянными», и смотрите только на них
  • в более глубоком взгляде рекурсивно примените этот подход ко всем аргументам выражения
  • если ни один из них не нарушает ваше понимание «скалярного постоянного выражения» — тогда это один