检查SQL语句是否合法
昨天又有一个新的需求:验证文本框输入的SQL语法是否正确。
于是就开始百度,其实也挺简单的。
首先需要知道“SET PARSEONLY { ON | OFF }”。
当 SET PARSEONLY 为 ON 时,SQL Server 只分析语句。
当 SET PARSEONLY 为 OFF 时,SQL Server 编译并执行语句。
和 SET PARSEONLY 相关的还有SET NOEXEC ON,
当 SET NOEXEC 为 ON 时,SQL Server 将编译每一条Tran-SQL语句但并不执行它们。
当 SET NOEXEC 为 OFF 时,SQL Server 编译并执行语句。
现在我们就可以完成SQL语法检测的功能了。
下面是具体的代码, 可以将其中的 ParseOnly 调整为 NoExec
public static bool ValidateSQL(string sql) { var connStr = "server=localhost;database=jhly;user id=sa;password=1"; bool bResult; using (SqlConnection conn = new SqlConnection(connStr)) { using (SqlCommand cmd = new SqlCommand()) { if (conn.State != ConnectionState.Open) conn.Open(); cmd.Connection = conn; cmd.CommandText = "SET PARSEONLY ON"; try { string strParams = "@starttime"; cmd.CommandText = sql; cmd.Parameters.AddWithValue(strParams, "2010-01-01"); cmd.ExecuteNonQuery(); bResult = true; } catch (Exception ex) { bResult = false; LogHelper.Error("SQL语法错误" + ex); } finally { cmd.CommandText = "SET PARSEONLY OFF"; cmd.ExecuteNonQuery(); } } } return bResult; }
他们之间的一些区别:
1.SET PARASEONLY 检查每个Tran-SQL 的语法并返回错误消息,不编译和执行语句。
SET NOEXEC 编译每个查询但不执行查询。
2.SET PARASEONLY 的设置是在分析时设置,不是在执行或运行时设置。
SET NOEXEC 的设置在执行或运行时设置,不是在分析时设置。
本文转自: https://blog.csdn.net/andrewniu/article/details/80166090