首页 > 解决方案 > 在动态 SQL 中,ScriptDom 正在查找 IF 语句,而不是 UPDATE 语句

问题描述

我正在使用 TransactSQL.ScriptDom 来解析 SQL 语句。我已经定义了要查找 a) IF 语句和 b) UPDATE 语句的规则。当我查看非动态 SQL 时,规则工作得很好。但是,当我查看动态 SQL 时,我的代码只检测到 IF 块;它不检测 UPDATE 语句。

例如,这段代码在非动态和动态场景中都被调试器命中:

public override void Visit(IfStatement ifStatement)
{
    ...
}

但是,此代码在任何动态 SQL 场景中都不会受到影响,我也尝试过使用 UpdateSpecification:

public override void Visit(UpdateStatement updateStatement)
{
    ...
}

现在,如果我将代码更改为 Visit(TSqlFragment test),代码将被命中,但我的 UPDATE 语句只看到一个 AsciiStringLiteral 类型的节点。有没有更好的方法让我的代码访问 UPDATE 语句?

标签: scriptdom

解决方案


忽略,这是用户错误。我的动态 SQL 中有一个 type-o,我错误地使用了单引号。换句话说,我正在使用这个:

@"EXEC('UPDATE dbo.MyTable
                SET MyColumn = 'MyValue';');",

...而不是这个:

@"EXEC('UPDATE dbo.MyTable
                SET MyColumn = ''MyValue'';');",

(我考虑完全删除这个问题,但我会留下它以防它帮助其他人。)


推荐阅读