0

我正在尝试使用Microsoft.SqlServer.TransactSql.ScriptDom来检查表达式是否为标量常量。

这是这样一个表达式:

DATEADD(YEAR, -21, CURRENT_TIMESTAMP)

这里不是这样的表达:

DATEADD(YEAR, -21, DateOfBirth)

它不是一个常量,因为它引用了 column DateOfBirth。我怎样才能确定这一点?

我没想到——以及我遇到麻烦的原因——Microsoft.SqlServer.TransactSql.ScriptDom认为那YEAR是一个ColumnReferenceExpression.

4

1 回答 1

0

(评论太长了)

ScriptDom不编译,只是将所有“奇怪的名称”解析并视为可能的列名,例如 inIF (MAGICNAME = 0)将被检测到名为 的“列” MAGICNAME。如果你想要更多,你必须自己为这个过程添加更多的智能。

这可以通过将额外的访问者类用作嵌套解析器来完成。并通过存储“与特定案例相关的已知魔术词”列表。在给定的情况下,这可能会导致代码:

  • 捕捉 udf
  • 检查它是否是众所周知的功能之一
  • 调用嵌套访问者类,该类更了解此特定功能

在这种方法中,(或所有日期处理函数)的特定访问者DATEADD可能具有单词列表YEARMONTH等等以将第一个参数的理解从“可能的列”更改为“已知的静态魔术词”

对于任何可能的情况,通常很难完成给定的任务,但是看起来很多情况都可以正确处理。一个想法是实现“鸭子打字”方法:

  • 检测可能是标量和“常量”的表达式,并仅对它们进行更深入的研究
  • 深入研究递归地将这种方法应用于所有表达式参数
  • 如果它们都没有违反您对“标量常量表达式”的理解 - 那么它就是一个
于 2021-02-08T09:35:57.730 回答