使用c#进行查询验证
如果您希望验证SQL语法而不使用数据库,那么TSql100Parser
类将适用于这种情况。
声明,这个职位在这里Code to validate SQL Scripts
相当简单的,虽然使用借来的代码。如果它返回null,那么在解析它时没有错误。
using Microsoft.Data.Schema.ScriptDom;
using Microsoft.Data.Schema.ScriptDom.Sql;
public class SqlParser
{
public List<string> Parse(string sql)
{
TSql100Parser parser = new TSql100Parser(false);
IScriptFragment fragment;
IList<ParseError> errors;
fragment = parser.Parse(new StringReader(sql), out errors);
if (errors != null && errors.Count > 0)
{
List<string> errorList = new List<string>();
foreach (var error in errors)
{
errorList.Add(error.Message);
}
return errorList;
}
return null;
}
}
设置查询与此提示
集PARSEONLY上 它只是检查您的查询,SQL和上 SELECT *返回
这样
集PARSEONLY从表A
也没有例外
和
集PARSEONLY上 选择* F ROM表A
回报
消息102,级别15,状态1,2号线 附近有语法错误 'F'。
那么。但是这个会调用数据库,在客户端解析它并验证SQL文本。我想避免数据库调用。此外,DB2 SQL的任何此类选项? – Cannon 2011-08-07 04:47:17
那是我知道的方式 – DeveloperX 2011-08-09 13:23:56
如果你想验证/解析一个SELECT语句,不管select语句的“重载”是什么,我发现验证select语句的最好和最快的方法如下: - 在你的代码中创建2个select语句(串),如:
1)本人有效select语句:SELECT * FROM HUGE_TABLE JOIN MULTIPLE_TABLES WHERE <<Condition>>
2)创建一个类似的select语句,如SELECT TOP 1 * FROM HUGE_TABLE JOIN MULTIPLE_TABLES WHERE <<Condition>>
- 解析/验证只是第二个,不管有多少加入你在那里,它会解析它毫秒,如:
SqlCommand sqlParse = new SqlCommand(ParseSelectStatement, sqlConn);
try
{
sqlConn.Open();
sqlParse.ExecuteNonQuery()
}
希望它有帮助!干杯!
不适用于UPDATE和INSERT或DELETE? – 2017-09-29 00:41:25
这需要您运行查询,如果其成功。 OP要求“在解析文本框中的SQL文本并在发送它执行前验证其正确与否” - 我理解下一个逻辑步骤是运行它,但您的方法不是OP要求的 – Sam 2018-03-08 18:40:24
MS SQL - 是最好的查询验证器。发送查询到它,它会抛出异常是查询是错误的。 :)另外,对于一个数据库引擎而言,相同的查询可能是正确的,而对另一个数据库则不正确为什么不让DB引擎验证? – 2011-06-09 03:40:50
MS SQL上的ExecuteSQL会在无效查询时抛出异常,但潜在的危害在于这些查询会被解雇,因为我唯一的目的是测试语法。什么是DB2的情况? – Cannon 2011-06-09 03:43:23
什么开销?数据库查询验证是查询工作流程中的第一步。它不仅会验证语法,还会检查表或列是否存在以及所有类似的事情。 – 2011-06-09 03:45:12