Parsing SQL code in C# [closed]
I want to parse SQL code using C#.
Specifically, is there any freely available parser which can parse SQL code and generate a tree or any other structure out of it? It should also generate the proper tree for nested structures.
It should also return which kind of statement the node of this tree represents.
For example, if the node contains a loop condition then it should return that this is a "loop type" of a node.
Or is there any way by which I can parse the code in C# and generate a tree of the type I want?
Specifically for Transact-SQL (Microsoft SQL Server) you can use the Microsoft.SqlServer.Management.SqlParser.Parser
namespace available in Microsoft.SqlServer.Management.SqlParser.dll, an assembly included with SQL Server and which can be freely distributed.
Here's an example method for parsing T-SQL as a string into a sequence of tokens:
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;
}
Note that the TokenInfo
class is just a simple class with the above-referenced properties.
Tokens
is this enumeration:
- Tokens Enumeration (Microsoft.SqlServer.Management.SqlParser.Parser)
and includes constants like TOKEN_BEGIN
, TOKEN_COMMIT
, TOKEN_EXISTS
, etc.
Scott Hanselman recently featured the Irony project which includes a sample SQL parser.
[Warning: answer may no longer apply as of 2021]
Use Microsoft Entity Framework (EF).
It has a "Entity SQL" parser which builds an expression tree,
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();
Or something like that, check it out on MSDN.
And it's all on Ballmers tick :-)
There is also one on The Code Project, SQL Parser.
Good luck.
You may take a look at a commerical component: general sql parser at http://www.sqlparser.com It supports SQL syntax of Oracle, T-SQL, DB2 and MySQL.