Составные идентификаторы в 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 ответ
(слишком длинный для комментария)
Это можно сделать, создав дополнительные классы посетителей, которые будут использоваться в качестве вложенных парсеров. И путем хранения списков «известных волшебных слов, относящихся к конкретным случаям». Что в данном случае может привести к коду, который:
- ловит удф
- проверяет, является ли это одной из известных функций
- вызывает вложенный класс посетителя, который больше знает об этой конкретной функции
При таком подходе конкретный посетитель для
Данная задача вряд ли может быть решена вообще для любого возможного случая, однако похоже, что многие случаи могут быть решены корректно. Идея состоит в том, чтобы реализовать подход «утиная типизация»:
- обнаруживать выражения, которые могут быть скалярными и «постоянными», и более глубоко рассматривать только их
- в более глубоком взгляде рекурсивно примените этот подход ко всем аргументам выражения
- если ни один из них не нарушает вашего понимания "скалярного постоянного выражения" - тогда это один