2015-04-11 2 views
0

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

Вот мой 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 :(
    } 
} 
+0

Даже если он говорит [здесь] (https://msdn.microsoft.com/en-us/library/microsoft.sqlserver.dac.model.tsqlmodel.isscriptbacked.aspx#P:Microsoft.SqlServer.Dac.Model .TSqlModel.IsScriptBacked), что пустые модели по умолчанию поддерживаются скриптом, я подумал, что попробую создать dacpac из модели с параметром loadAsScriptBackedModel, установленным в true, как показано здесь [https://github.com/GoEddie/ DacpacExplorer/commit/be821f2505aab4e5a6c2510db0cb505323bfe534), но это также не сработало. – adam0101

ответ

1

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

+0

А, спасибо вам большое. Это именно то, что мне нужно, чтобы получить эти проклятые SelectStatement. Это будет очень здорово, когда я покончу с этим. Еще раз спасибо. – adam0101

+0

Еще раз спасибо Кевин. Вот мой первый релиз, если вам интересно: https://github.com/aeslinger0/sqlsharpener – adam0101

+0

Блестящий! Я обязательно проверю это, отличная работа. И спасибо за использование лицензии MIT, что облегчает мне просмотр кода :-) –

Смежные вопросы