昨天又有一个新的需求:验证文本框输入的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

  1. public static bool ValidateSQL(string sql)
  2. {
  3. var connStr = "server=localhost;database=jhly;user id=sa;password=1";
  4. bool bResult;
  5. using (SqlConnection conn = new SqlConnection(connStr))
  6. {
  7. using (SqlCommand cmd = new SqlCommand())
  8. {
  9. if (conn.State != ConnectionState.Open)
  10. conn.Open();
  11. cmd.Connection = conn;
  12. cmd.CommandText = "SET PARSEONLY ON";
  13.  
  14. try
  15. {
  16. string strParams = "@starttime";
  17. cmd.CommandText = sql;
  18. cmd.Parameters.AddWithValue(strParams, "2010-01-01");
  19. cmd.ExecuteNonQuery();
  20. bResult = true;
  21. }
  22. catch (Exception ex)
  23. {
  24. bResult = false;
  25. LogHelper.Error("SQL语法错误" + ex);
  26. }
  27. finally
  28. {
  29. cmd.CommandText = "SET PARSEONLY OFF";
  30. cmd.ExecuteNonQuery();
  31. }
  32. }
  33. }
  34. return bResult;
  35. }

他们之间的一些区别:

1.SET PARASEONLY 检查每个Tran-SQL 的语法并返回错误消息,不编译和执行语句。

SET NOEXEC 编译每个查询但不执行查询。

2.SET PARASEONLY 的设置是在分析时设置,不是在执行或运行时设置。

SET NOEXEC 的设置在执行或运行时设置,不是在分析时设置。

本文转自: https://blog.csdn.net/andrewniu/article/details/80166090

检查SQL语句是否合法的更多相关文章

  1. PHP判断SQL语句是否合法:mysqli_error()

    假设现在有条update语句,有时候update语句正确,但是受影响的行数是0. 那么怎么判断这条SQL语句到底是否正确?使用 mysqli_error($Conn); create table us ...

  2. 基本 sql语句

    1.打开数据库 int sqlite3_open( const char *filename,   // 数据库的文件路径 sqlite3 **ppDb          // 数据库实例 ); 2. ...

  3. sql语句错误

    此错误一般有以下情况造成: 1.配置文件中SQL语句写的有问题 2.传参过程中没有找到sql对应的参数 解决方法: 1.检查sql语句 2.debug启动,查找与sql语句相对应的参数是否存在. 3. ...

  4. FP 某段SQL语句执行时间超过1个小时,并报错:ORA-01652: 无法通过 128 (在表空间 TEMPSTG 中) 扩展

    一.出现如下两个错误:1.某一段SQL语句执行时间超过1个小时:2.一个小时后,提示如下错误:ORA-01652: 无法通过 128 (在表空间 TEMPSTG 中) 扩展 temp 段ORA-065 ...

  5. 执行超过1个小时的SQL语句

    SELECT MO.MO_ID, MO.ITEM, MO.QTYORDERED, MO.PLANNEDSTARTDATE, BR.MAXLOTSIZE FROM TEMP_MO MO, (SELECT ...

  6. 第五篇、常用的SQL语句和函数介绍

    简介: 在使用到sqlite3的时候,常常需要写一些SQL语句,现将常用到的部分语句稍微总结以下,由于个人习惯,关键字用大写. 附: /*简单约束*/ CREATE TABLE IF NOT EXIS ...

  7. java中的sql语句中如果有like怎么写

    我先是在SQL server中写了如下语句: 这样是顺利执行的,可是我把这句话复制到Java代码中打出来却报错了, 刚开始我还以为是前端没有传回来值,待我一句一句打印发现,它提示我rs没有next.到 ...

  8. 如何通过outline为SQL语句指定执行计划

    创建测试表 以用户jyu连接,创建测试表 SQL> conn jyu/jyu; Connected. SQL> create table t (id number, name varcha ...

  9. Oracle SQL语句性能优化方法大全

    Oracle SQL语句性能优化方法大全 下面列举一些工作中常常会碰到的Oracle的SQL语句优化方法: 1.SQL语句尽量用大写的: 因为oracle总是先解析SQL语句,把小写的字母转换成大写的 ...

随机推荐

  1. Android-UIUtils-工具类

    UIUtils工具类,主要是处理和Activity有关,和界面显示层有关的公共方法: package common.library.utils; import android.app.Activity ...

  2. Android-有序广播是可以中断的

    在之前的博客,Android-广播概念,中介绍了(广播和广播接收者)可以组件与组件之间进行通讯,有两种类型的广播(无序广播 和 有序广播),这篇博客就来讲解有序广播的代码实现: 有序广播:接收者 可以 ...

  3. 在ASP.NET Core2上操作MongoDB就是能这么的简便酷爽(自动完成分库分表)

    NoSQL是泛指非关系型的数据库,现今在我们的项目中也多有使用,其独特的优点为我们的项目架构带来了不少亮点,而我们这里的主角(MongoDB)则是NoSQL数据库家族中的一种.事实上,NoSQL数据库 ...

  4. VS2017安装时自动退出

    电脑重装系统后 win10,安装VS2017,一直不成功:保持一定时间后就自动退出,而没有跳到具体安装选择项界面.重复了好几次,并且电脑也重启还是这样. 最后在系统盘下面找到文件夹:C:\Progra ...

  5. Rest-assured 写日志到 log4j

    背景: 采用Rest-assured,日志采用log4j,发现Rest-assured本身只支持打印日志到控制台,但期望打印到文件中以便排查问题 请求打印的语句只能输出到控制台 given().log ...

  6. [uwp]自定义Behavior之随意拖动

    由于最近有需求,所以自定义了一个随意拖动元素的Behavior. 当然在使用这个自定义的Behavior时,有个小假设:拖动元素必须是Canvas容器的子元素. 实现原理比较简单低效: 监听被拖动元素 ...

  7. Linux 常用命令大放送

    sbin 系统底层命令存放目录 bin  一般用户常用命令目录 文件用户管理 ls -lh 显示权限cp   -r 复制文件 文件夹 mkdir  test 创建文件夹rm    -rf  删除文件 ...

  8. Ubuntu16.04 - 怎么能够更好设置PATH变量,便于管理?

    “/etc/profile”是linux里面的全局变量设置文件,加入这里的PATH变量,全局都可以使用,非常方便.加入时候很简单了,直接在PATH末尾加入":+要加入的变量"就可以 ...

  9. 如何让Gogland不过期,一直使用?

    Gogland是jetBrains公司出品的GO语言开发IDE,是目前最好的GO语言开发工具!!但是目前Gogland提供的试用版,有一定的使用期限,如何到期还能使用?经过我的测试,如果Gogland ...

  10. java学习笔记—c3p0连接池与元数据分析(42)

    第一步:导入c3p0包 第二步:在classpath目录下,创建一个c3p0-config.xml <?xml version="1.0" encoding="UT ...