Как получить SelectStatement из процедуры?

Это дополнительный вопрос здесь. Я пытаюсь использовать DACExtensions для получения SelectStatement объекты из Procedure так что я могу генерировать функции-оболочки из моего проекта SSDT, используя шаблон T4. Проблема в том, что свойство Nodes моего объекта Visitor не имеет никаких узлов в нем. Что мне не хватает?

Вот мой посетитель:

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 :(
    }
}

1 ответ

Решение

Использование TSqlModelUtils.TryGetFragmentForAnalysis должно гарантировать, что вы получите оригинальный AST внутри модели - надеюсь, что он будет иметь то, что вам нужно. Возможно, вы захотите отладить и просмотреть свой AST и то, что на самом деле создается - вот как мы делаем вещи внутри, и часто вы можете быть удивлены тем, что на самом деле генерируется. Наконец, обратите внимание, что инструмент DacpacExplorer может облегчить визуализацию - теперь он должен иметь поддержку для отображения AST за объектом, таким как процедура.

Другие вопросы по тегам