用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#
如果您只是想验证语法。您可以使用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的建议。