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

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

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

DATEADD(YEAR, -21, CURRENT_TIMESTAMP)

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

DATEADD(YEAR, -21, DateOfBirth)

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

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

1 ответ

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

не компилирует, просто анализирует и обрабатывает все "странные имена" как возможные имена столбцов, например, в будет обнаружен "столбец" с именем . Если вы хотите большего , вы должны добавить больше интеллекта в этот процесс самостоятельно.

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

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

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

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

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