将T-SQL语句解析为标记

got*_*tqn 6 .net c# t-sql sql-server parsing

你可以在这里看到C#代码语句如何很好地解析到令牌.例如,以下代码:

namespace MyNamespace
{
    class MyClass
    {
        public void MyFunction(int arg1)
        {
            int var1 = arg1;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

被解析为:

在此输入图像描述

我想做这样的事情但是用T-SQL声明代替.例如,如果我有以下T-SQL声明:

IIF(COALESCE([Col001], [Col002], [Col003]) > [Col004], [Col005] * [Col006] + ISNULL([Col007], [Col008]), CONCAT(SUBSTRING([Col009], 0, 3), 'sample text', [Col010]))
Run Code Online (Sandbox Code Playgroud)

会给我这样的东西:

IIF, COALESCE, ISNULL, CONCAT, SUBSTRING    - functions 
[Col001], [Col002], ... , [Col010]          - columns 
0, 3, 'sample text'                         - variables
Run Code Online (Sandbox Code Playgroud)

或者如果我有:

ISNULL([Col001], [Col002], [Col003])
Run Code Online (Sandbox Code Playgroud)

有错误的结构:

[The isnull function requires 2 argument(s).] - error
Run Code Online (Sandbox Code Playgroud)

没有任何免费或付费的最新解决方案,似乎使用Microsoft解析器是这里的最佳解决方案.正如我所读,我需要使用Microsoft.SqlServer.Management.SqlParser.Parser命名空间,但没有任何示例,我无法T-SQL按照我喜欢的方式拆分语句.此外,它似乎只适用于完整的语句(SELECT例如,您需要子句,我只需要将它用于代码片段).

我可以使用此命名空间执行此操作,还是最好开始C#为我的需求编写类?

xan*_*tos 11

我不得不在csproj中手动添加引用

Microsoft.SqlServer.Management.SqlParser,Version = 12.0.0.0,Culture = neutral,PublicKeyToken = 89845dcd8080cc91

喜欢

<Reference Include="Microsoft.SqlServer.Management.SqlParser, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
Run Code Online (Sandbox Code Playgroud)

一个简单的例子:

string sql = "IIF(COALESCE([Col001], [Col002], [Col003]) > [Col004], [Col005] * [Col006] + ISNULL([Col007], [Col008]), CONCAT(SUBSTRING([Col009], 0, 3), 'sample text', [Col010]))";

var po = new ParseOptions { };
var scanner = new Scanner(po);
scanner.SetSource(sql, 0);

Tokens token;
int state = 0;
int start;
int end;
bool isPairMatch;
bool isExecAutoParamHelp;

while ((token = (Tokens)scanner.GetNext(ref state, out start, out end, out isPairMatch, out isExecAutoParamHelp)) != Tokens.EOF)
{
    string str = sql.Substring(start, end - start + 1);
    Console.WriteLine("{0}: {1}", token, str);
}
Run Code Online (Sandbox Code Playgroud)

取自http://www.sqlservercentral.com/blogs/dave_ballantynes_blog/2012/03/13/parsing-t-sql-the-easy-way/

请注意,这个分析器识别一定数量的功能(例如IIF,COALESCE...).无法识别的函数只是标记为TOKEN_ID列名称.