c# - 将 T-SQL 语句解析为标记

标签 c# .net sql-server tsql parsing

可以看到here C#代码语句被解析为标记的效果如何。例如下面的代码:

namespace MyNamespace
{
    class MyClass
    {
        public void MyFunction(int arg1)
        {
            int var1 = arg1;
        }
    }
}

解析为:

enter image description here

我想做这样的事情,但用 T-SQL 语句代替。例如,如果我有以下 T-SQL 语句:

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

会给我这样的东西:

IIF, COALESCE, ISNULL, CONCAT, SUBSTRING    - functions 
[Col001], [Col002], ... , [Col010]          - columns 
0, 3, 'sample text'                         - variables

或者如果我有:

ISNULL([Col001], [Col002], [Col003])

有错误的结构:

[The isnull function requires 2 argument(s).] - error

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

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

最佳答案

我必须在 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" />

一个简单的例子:

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);
}

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

取自Parsing T-SQL – The easy way

请注意,此解析器可识别一定数量的函数(如 IIFCOALESCE 等)。无法识别的函数被简单地标记为 TOKEN_ID,如列名。

关于c# - 将 T-SQL 语句解析为标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30452864/

相关文章:

sql - 根据观察结果创建稀疏矩阵

c# - 生成串联的 SMS UDH 并将其添加到消息文本中

c# - 如何强制将单个域用于 ASP.NET MVC 站点?

c# - 进程开始时间

c# - 是否可以克隆 .NET 流?

c# - 如何使用 "Resources embedded in resx"的资源?

c# - 让 Entity Framework 与 SQL Server 地理空间索引一起使用

sql - Microsoft SQL Server 查询改进

c# - ADO .NET EF 中的可组合查询每次迭代返回更多实体

c# - 如何使用带有wp7的GPS获取地址名称