我想用C#解析SQL代码.
具体来说,是否有任何可自由使用的解析器可以解析SQL代码并从中生成树或任何其他结构?它还应该为嵌套结构生成适当的树.
它还应该返回该树节点所代表的那种语句.
例如,如果节点包含循环条件,那么它应该返回这是节点的"循环类型".
或者有什么方法可以解析C#中的代码并生成我想要的类型的树?
And*_*ykh 18
特别是对于Transact-SQL(Microsoft SQL Server),您可以使用Microsoft.SqlServer.Management.SqlParser.dll中提供的Microsoft.SqlServer.Management.SqlParser.Parser命名空间,这是SQL Server附带的程序集,可以自由分发.
这是一个将T-SQL解析为字符串序列的示例方法:
IEnumerable<TokenInfo> ParseSql(string sql)
{
ParseOptions parseOptions = new ParseOptions();
Scanner scanner = new Scanner(parseOptions);
int state = 0,
start,
end,
lastTokenEnd = -1,
token;
bool isPairMatch, isExecAutoParamHelp;
List<TokenInfo> tokens = new List<TokenInfo>();
scanner.SetSource(sql, 0);
while ((token = scanner.GetNext(ref state, out start, out end, out isPairMatch, out isExecAutoParamHelp)) != (int)Tokens.EOF)
{
TokenInfo tokenInfo =
new TokenInfo()
{
Start = start,
End = end,
IsPairMatch = isPairMatch,
IsExecAutoParamHelp = isExecAutoParamHelp,
Sql = sql.Substring(start, end - start + 1),
Token = (Tokens)token,
};
tokens.Add(tokenInfo);
lastTokenEnd = end;
}
return tokens;
}
Run Code Online (Sandbox Code Playgroud)
请注意,TokenInfo该类只是一个具有上述属性的简单类.
Tokens 这是枚举:
并包括像常数TOKEN_BEGIN,TOKEN_COMMIT,TOKEN_EXISTS等.
TFD*_*TFD 10
使用Microsoft 实体框架(EF).
它有一个"Entity SQL"解析器,用于构建表达式树,
using System.Data.EntityClient;
...
EntityConnection conn = new EntityConnection(myContext.Connection.ConnectionString);
conn.Open();
EntityCommand cmd = conn.CreateCommand();
cmd.CommandText = @"Select t.MyValue From MyEntities.MyTable As t";
var queryExpression = cmd.Expression;
....
conn.Close();
Run Code Online (Sandbox Code Playgroud)
或类似的东西,请在MSDN上查看.
这一切都在Ballmers上打勾:-)
代码项目中还有一个SQL Parser.
祝好运.
| 归档时间: |
|
| 查看次数: |
83669 次 |
| 最近记录: |