Это следующий вопрос от 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 :(
}
}
Даже если он говорит [здесь] (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