#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»:
- обнаруживайте выражения, которые могут быть скалярными и «постоянными», и смотрите только на них
- в более глубоком взгляде рекурсивно примените этот подход ко всем аргументам выражения
- если ни один из них не нарушает ваше понимание «скалярного постоянного выражения» — тогда это один