在c#中解析SQL字符串

我需要解析一个Command.CommandText

我不想运行查询。 我只想查看执行命令时查询是否成功。

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

此字符串将成功。

但,

 "SELECT * FROM SomeTable WHERE (1=1" 

不会成功。

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

如果您只想validation语法。 您可以使用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 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 – 您将能够’validation’SQL,但我认为您将遇到的问题是它不是100%。 我用过的所有这些都没有为实际的数据库提供相同的结果。 您会发现某些SQL字符串对您的解析器有效,但对数据库无效,反之亦然。 例如,在AQB中,如果没有为别名提供别名或者解析器会抛出exception,则不能有子查询 – 但Oracle很乐意接受并运行相同的SQL。

根据数据库的不同,您应该能够要求DATABASE在不运行SQL的情况下validationSQL。 在SQL Server中,我相信您可以使用Oracle中的Prepare语句,我相信它被称为解释计划

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

基于您使用SqlCommand的事实,我假设您要检查针对Sql Server的语句的正确性。 正如人们所指出的那样, 准备声明是最合适的。 在c#端,您只能检查语法的正确性,而不是其他任何内容(这并不意味着查询将通过)。 准备语句将检查命名解析,绑定等,但它将包括到服务器的往返。 此外,您必须了解其局限性(例如临时对象)。 有关TSQL Prepare语句的详细信息,请查看此处 。

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

如果您只需要validationMicrosoft SQL Server的SQL语法,Microsoft.Data.Schema.ScriptDom是一个不错的选择。 否则,您可能会考虑其他SQL Parser,例如General SQL Parser (支持Oracle,SQL Server,DB2,MySQL,Teradata,PostgreSQL),可帮助您在程序中执行脱机SQL语法检查。

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

为了分析任何正式语言,我建议你使用Irony库,它在生产和个别项目中都非常流行,并且已经有一个内置的SQL语法,所以这只是调用初始化程序的问题。 它会为您提供有关错误及其类型的信息,但对于更简单的使用Ira的提议。