检查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语句,把小写的字母转换成大写的 ...
随机推荐
- centos环境下创建数据库和表的方法
centos环境下创建数据库和表的方法 //查询数据库的命令: mysql> SHOW DATABASES; +--------------------+ | Database ...
- http://blog.csdn.net/hongchangfirst/article/details/26004335
悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁.传统的 关系型数 ...
- OA与ERP集成 可行?
[正文] 近些年来,当谈论到企业信息化的时候,ERP都成为一个热门话题,ERP的出现似乎给企业带来了一个翻天覆地的变化,而且也成为企业实现信息化的"新宠儿".然而OA也曾经是企业信 ...
- 利用ROW_NUMBER中的partition by 删除重复Key的数据
With temp As ( Select ROW_NUMBER() over(partition by LogisticsPlan order by createon) rowID,ID from ...
- 自定义TFS工作项“所有链接”列表中的列
这个功能只有使用团队资源管理器查看工作项才有
- 开源一款强大的文件服务组件(QJ_FileCenter)(系列三 访问接口与项目集成)
系列文章 1. 开源一款强大的文件服务组件(QJ_FileCenter)(系列一) 2. 开源一款强大的文件服务组件(QJ_FileCenter)(系列二 安装说明) 3. 开源一款强大的文件服务组件 ...
- 学习React前端框架,报错 'render' is not defined no-undef
报错 'render' is not defined no-undef 原因没有 写 import { render } from 'react-dom'
- EasyUi控件Datagrid
很久没有打开我的博客园,刚刚大概扫了一眼我之前写的笔记,关于Devexpress那篇居然有四千多的浏览记录,不知道对浏览过的博友有没有起到一点点作用.当然我写笔记仅仅只是给自己留个记忆,如果歪打正着帮 ...
- python单引号和双引号的区别
今天在网上爬虫的时候,很奇怪的发现python的字符串既可以用双引号又可以用单引号,于是就上网百度了一下原因. 原来由于字符串中有可能既有双引号又有单引号,例如: 字符串:demo'1'. 这时候就可 ...
- 【OCP-12c】2019年CUUG OCP 071考试题库(77题)
77.Which two statements are true about sequences created in a single instance database? (Choose two. ...