0

これはhereからのフォローアップの質問です。T4 テンプレートを使用して SSDT プロジェクトからラッパー関数を生成できるように、 DACExtensionsSelectStatementを使用してからオブジェクトを取得しようとしています。Procedure問題は、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 に答える