0

这是here的后续问题。我正在尝试使用DACExtensions从 a中检索SelectStatement对象,Procedure以便我可以使用 T4 模板从我的 SSDT 项目中生成包装函数。问题是我的 Visitor 对象的 Nodes 属性中没有任何节点。我错过了什么?

这是我的访客:

public class SelectVisitor : TSqlFragmentVisitor
{
    public SelectVisitor() { this.Nodes = new List<SelectStatement>(); }
    public List<SelectStatement> Nodes { get; private set; }
    public override void Visit(SelectStatement node)
    {
        base.Visit(node);
        this.Nodes.Add(node);
    }
}

这是我尝试使用它的方式:

// Create the model
var procFiles = Directory.GetFiles(sqlPath, "*.sql", SearchOption.AllDirectories);
var model = new TSqlTypedModel(SqlServerVersion.Sql100, new TSqlModelOptions());
foreach(var procFile in procFiles)
{
    model.AddObjects(File.ReadAllText(procFile));
}

// Loop through the procs
var procs = model.GetObjects<TSqlProcedure>(DacQueryScopes.UserDefined);
foreach(var proc in procs){ 
    var selectVisitor = new SelectVisitor();
    var ast = proc.GetAst();
    ast.Accept(selectVisitor);
    foreach(var node in selectVisitor.Nodes){
        // Nodes has Count=0 :(
    }
}
4

1 回答 1

1

使用TSqlModelUtils.TryGetFragmentForAnalysis应该确保您在模型中获得原始 AST - 希望这将拥有您所需要的。您可能想要调试并查看您的 AST 以及实际创建的内容 - 这就是我们在内部做事的方式,而且您通常会对实际生成的内容感到惊讶。最后请注意,DacpacExplorer工具可能会使这更容易可视化——它现在应该支持在诸如过程之类的对象后面显示 AST。

于 2015-04-13T17:23:24.347 回答