检查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

 

posted @ 2018-09-13 17:58  代码工人有力量  阅读(26826)  评论(2编辑  收藏  举报