如果我有一个带有一组语句的TqlFragment或TsqlScript,如何使用DacFX注释特定的语句?没有CommentStatement或类似的东西。如何将语法树中的语句替换为注释版本的语句?
我知道这可以通过纯文本编辑或regex来完成,但此时我正在使用DacFx访问者模式扫描某些语句。所以我需要继续使用这个约束。
发布于 2018-03-12 16:48:49
艾德,我重新整理了你的答案。
意见:
代码:
class Program
{
static void Main(string[] args)
{
var sqlText = @"
create procedure something
as
select 100;
select 200
exec sp_who;
exec sp_who2;
";
var sql = new StringReader(sqlText);
var parser = new TSql140Parser(false);
var script = parser.Parse(sql, out IList<ParseError> errors);
var visitor = new ExecVisitor();
script.Accept(visitor);
TSqlParserToken startComment = new TSqlParserToken(TSqlTokenType.SingleLineComment, "/*");
TSqlParserToken endComment = new TSqlParserToken(TSqlTokenType.SingleLineComment, "*/");
var newScriptTokenStream = new List<TSqlParserToken>(script.ScriptTokenStream);
for(var i = visitor.Statements.Count - 1; i >= 0; i--)
{
var stmt = visitor.Statements[i];
newScriptTokenStream.Insert(stmt.LastTokenIndex, endComment);
newScriptTokenStream.Insert(stmt.FirstTokenIndex, startComment);
}
var newFragment = parser.Parse(newScriptTokenStream, out errors);
Console.WriteLine(GetScript(newFragment.ScriptTokenStream));
}
private static string GetScript(IList<TSqlParserToken> tokenStream)
{
var sb = new StringBuilder();
foreach(var t in tokenStream)
{
sb.Append(t.Text);
}
return sb.ToString();
}
}
class ExecVisitor : TSqlFragmentVisitor
{
public IList<ExecuteStatement> Statements { get; set; } = new List<ExecuteStatement>();
public override void Visit(ExecuteStatement s)
{
Statements.Add(s);
}
}结果:
create procedure something
as
select 100;
select 200
/*exec sp_who*/;
/*exec sp_who2*/;https://stackoverflow.com/questions/49178729
复制相似问题