用c#解析SQL字符串

本文关键字:字符串 SQL 解析 | 更新日期: 2023-09-27 18:08:52

我需要解析一个Command.CommandText

我不想运行查询。我只想看看如果执行了命令,查询是否会成功。

说我有;"SELECT * FROM SomeTable WHERE (1=1)"

这个字符串将会成功。

,

"SELECT * FROM SomeTable WHERE (1=1"

将不会成功。

现在我的问题是。如何Parse这个字符串c#

用c#解析SQL字符串

如果您只是想验证语法。您可以使用Microsoft.Data.Schema.ScriptDom。

using Microsoft.Data.Schema.ScriptDom;
using Microsoft.Data.Schema.ScriptDom.Sql;
.....
        string sql = "SELECT * FROM SomeTable WHERE (1=1";
        var p = new TSql100Parser(true);
        IList<ParseError> errors;
        p.Parse(new StringReader(sql), out errors);

        if (errors.Count == 0)
            Console.Write("No Errors");
        else
            foreach (ParseError parseError in errors)
                Console.Write(parseError.Message);

我尝试了一些库,这些库的设计目的是在代码中解析/操作/生成SQL。最近的是ActiveQueryBuilder,但我知道有很多。

与AQB -你将能够"验证"SQL,但我认为你会遇到的问题是,它不是100%。我用过的这些方法,都没有提供与实际数据库相同的结果。您将发现某些SQL字符串在解析器看来是有效的,但在数据库看来是无效的,反之亦然。例如,在AQB中,如果不给子查询指定别名,就不能有子查询,否则解析器会抛出异常——但是Oracle会很乐意接受并运行相同的SQL。

根据数据库的不同,您应该能够要求database验证SQL而不运行它。在SQL Server中,我相信你可以使用Prepare语句,在Oracle中,我相信它被称为Explain Plan

这是我发现的获得一致结果的唯一方法。当然,如果你的查询是简单的,或者如果你不需要100%的准确性,这可能是更多的工作。

基于您使用SqlCommand的事实,我假设您想检查Sql Server上语句的正确性。正如人们所指出的,Prepare语句是可以使用的。在c#方面,您只能检查语法的正确性,而不能检查其他任何东西(这并不意味着查询将通过)。Prepare语句将检查命名解析、绑定等,但它将包含到服务器的往返。此外,您必须意识到它的局限性(例如临时对象)。有关TSQL Prepare语句的详细信息,请查看此处。

正如你所说:"我不想运行查询。"

Microsoft.Data.Schema。如果您只需要验证Microsoft SQL Server的SQL语法,ScriptDom是一个不错的选择。否则,你可以考虑其他SQL解析器,如通用SQL解析器(支持Oracle, SQL Server, DB2, MySQL, Teradata, PostgreSQL),帮助你做离线SQL语法检查在你的程序。

这可以通过在形式语法的帮助下分析您的查询来完成,但这可能对您来说是一个过载,完全取决于您的使用场景。

对于分析任何形式语言,我建议您使用Irony库,它在生产和个人项目中都非常流行,并且已经具有内置的SQL语法,因此只需调用该初始化项即可。它会告诉你有关错误及其类型的信息,但为了更简单,请使用Ira的建议。