我想建立T-SQL解析器,将建立新的查询不同的DBMS与特定的规则。第一个规则,要实现的是添加到每个列名的开始和结束的列名'
。
我从下面的链接SQL, all column names are in brackets, C#获得代码
所用代码:
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using Microsoft.SqlServer.TransactSql.ScriptDom;
namespace ConsoleApplication8
{
public class QueryParser
{
public IEnumerable<string> Parse(string sqlSelect)
{
TSql100Parser parser = new TSql100Parser(false);
TextReader rd = new StringReader(sqlSelect);
IList<ParseError> errors;
var columns = new List<string>();
var fragments = parser.Parse(rd, out errors);
var columnVisitor = new SQLVisitor();
fragments.Accept(columnVisitor);
columns = new List<string>(columnVisitor.Columns);
return columns;
}
}
internal class SQLVisitor : TSqlFragmentVisitor
{
private List<string> columns = new List<string>();
private string GetNodeTokenText(TSqlFragment fragment)
{
StringBuilder tokenText = new StringBuilder();
for (int counter = fragment.FirstTokenIndex; counter <= fragment.LastTokenIndex; counter++)
{
tokenText.Append(fragment.ScriptTokenStream[counter].Text);
}
return tokenText.ToString();
}
public override void ExplicitVisit(ColumnReferenceExpression node)
{
columns.Add(GetNodeTokenText(node));
}
public IEnumerable<string> Columns {
get { return columns; }
}
}
public class Program
{
private static void Main(string[] args)
{
QueryParser queryParser = new QueryParser();
var columns = queryParser.Parse("SELECT A,[B],C,[D],E FROM T WHERE isnumeric(col3) = 1 Order by Id desc");
foreach (var column in columns)
{
Console.WriteLine(column);
}
}
}
}
但是我不知道如何构建一个新脚本,新老脚本之间的唯一区别是列名为'
。
下面SQL的结果是:
SELECT A,[B],C,[D],E FROM T WHERE isnumeric(col3) = 1 Order by [Id] desc
应该是
SELECT A,'B',C,'D',E FROM T WHERE isnumeric(col3) = 1 Order by 'Id' desc
1条答案
按热度按时间ux6nzvsh1#
下面是代码的重构版本,它将列标识符引用中的方括号替换为单引号,并返回转换后的脚本。这也将替换多部分标识符中的括号。
我用
QueryParser
类实现了访问器,继承自TSqlConcreteFragmentVisitor
而不是TSqlFragmentVisitor
,最好使用具体的访问器作为基类,除非你需要将片段作为抽象基类来访问。