检查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
检查SQL语句是否合法的更多相关文章
- PHP判断SQL语句是否合法:mysqli_error()
假设现在有条update语句,有时候update语句正确,但是受影响的行数是0. 那么怎么判断这条SQL语句到底是否正确?使用 mysqli_error($Conn); create table us ...
- 基本 sql语句
1.打开数据库 int sqlite3_open( const char *filename, // 数据库的文件路径 sqlite3 **ppDb // 数据库实例 ); 2. ...
- sql语句错误
此错误一般有以下情况造成: 1.配置文件中SQL语句写的有问题 2.传参过程中没有找到sql对应的参数 解决方法: 1.检查sql语句 2.debug启动,查找与sql语句相对应的参数是否存在. 3. ...
- FP 某段SQL语句执行时间超过1个小时,并报错:ORA-01652: 无法通过 128 (在表空间 TEMPSTG 中) 扩展
一.出现如下两个错误:1.某一段SQL语句执行时间超过1个小时:2.一个小时后,提示如下错误:ORA-01652: 无法通过 128 (在表空间 TEMPSTG 中) 扩展 temp 段ORA-065 ...
- 执行超过1个小时的SQL语句
SELECT MO.MO_ID, MO.ITEM, MO.QTYORDERED, MO.PLANNEDSTARTDATE, BR.MAXLOTSIZE FROM TEMP_MO MO, (SELECT ...
- 第五篇、常用的SQL语句和函数介绍
简介: 在使用到sqlite3的时候,常常需要写一些SQL语句,现将常用到的部分语句稍微总结以下,由于个人习惯,关键字用大写. 附: /*简单约束*/ CREATE TABLE IF NOT EXIS ...
- java中的sql语句中如果有like怎么写
我先是在SQL server中写了如下语句: 这样是顺利执行的,可是我把这句话复制到Java代码中打出来却报错了, 刚开始我还以为是前端没有传回来值,待我一句一句打印发现,它提示我rs没有next.到 ...
- 如何通过outline为SQL语句指定执行计划
创建测试表 以用户jyu连接,创建测试表 SQL> conn jyu/jyu; Connected. SQL> create table t (id number, name varcha ...
- Oracle SQL语句性能优化方法大全
Oracle SQL语句性能优化方法大全 下面列举一些工作中常常会碰到的Oracle的SQL语句优化方法: 1.SQL语句尽量用大写的: 因为oracle总是先解析SQL语句,把小写的字母转换成大写的 ...
随机推荐
- IntricCondition和expliciteCondition比较
IntricCondition 和 expliciteCondition 的区别 与 intrinsicLoc和expliciteLock的区别很相似, expliciteCondition提供了更多 ...
- 第二届CCCC赛后感想 2017-04-15 23:56 88人阅读 评论(0) 收藏
第一次写赛后感想,也不算什么很正规的比赛,不过这次比赛的时间恰好处于思想变化的阶段,留贴纪念. 先谈谈这次比赛,弱校萌新,依靠申请进了总决赛,发现和第一届不一样,缺少了团队奖心中有点缺乏动力,比赛2个 ...
- Codeforces 766C Mahmoud and a Message 2017-02-21 13:57 62人阅读 评论(0) 收藏
C. Mahmoud and a Message time limit per test 2 seconds memory limit per test 256 megabytes input sta ...
- Jmeter-Ant 生成测试报告
一.安装jmeter 配置环境变量 JMETER_HOME D:\SProgram\jmeter CLASSPATH %JMETER_HOME\lib\ext\ApacheJMeter_core.ja ...
- 作业 c++编写
1.第一版本程序Prog1:+ 给定一个数组,实现数组元素求和:,具体要求:实现对一维数组(a[100])的所有元素相加运算.+ 数据准备:a)数组长度:100:b)数组数据来源:实验数据A列:1~1 ...
- threadpoolExecutor----自动执行任务
使用threadpoolExecutor,主要是任务的提交的执行和获取结果. 提交任务的方法有: 1.submit 2.execute 3.queue的add 其中1和2的使用必须是threadpoo ...
- Jenkins RestAPI调用出现Error 403 No valid crumb was included in the request
方法一(不推荐): 在jenkins 的Configure Global Security下 , 取消“防止跨站点请求伪造(Prevent Cross Site Request Forgery exp ...
- jenkins pipeline中执行nohup java -jar ***.jar & 的时候会忽略执行jar之后的命令
搜索关键词:pipeline中执行nohup时忽略执行& 问题: 在做自动化部署的时候,脚本如下: sh "ssh root@'$target_ip' nohup '$java_ho ...
- .net core webapi 定义多版本与 Swagger 的文档输出
前提: 需要nuget 以下两个程序集 Swashbuckle.AspNetCore 我暂时用的是 4.01: Microsoft.AspNetCore.Mvc.Versioning.ApiExp ...
- JavaScript数组(参考资料)
JavaScript数组的长度和元素类型都是非固定的.因为数组的长度可随时改变,并且其数据在内存中也可以不连续,所以 JavaScript 数组不一定是密集型的,这取决于它的使用方式.1.Array. ...