昨天又有一個新的需求:驗證文本框輸入的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