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

原文地址:https://www.cnblogs.com/iiwen/p/9642097.html

时间: 2024-07-29 21:53:36

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

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

假设现在有条update语句,有时候update语句正确,但是受影响的行数是0. 那么怎么判断这条SQL语句到底是否正确?使用 mysqli_error($Conn); create table user( name varchar(20), age int(5), hobby text); mysql> insert into user values('zhangsan',11,'test....'); Query OK, 1 row affected (0.01 sec) mysql> u

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

创建测试表 以用户jyu连接,创建测试表 SQL> conn jyu/jyu; Connected. SQL> create table t (id number, name varchar2(100)); Table created. SQL> insert into t select rownum,object_name from dba_objects; 47391 rows created. SQL> commit; Commit complete. 创建索引 SQL>

基本 sql语句

1.打开数据库 int sqlite3_open( const char *filename,   // 数据库的文件路径 sqlite3 **ppDb          // 数据库实例 ); 2.执行任何SQL语句 int sqlite3_exec( sqlite3*,                                  // 一个打开的数据库实例 const char *sql,                           // 需要执行的SQL语句 int (*ca

[转] Oracle sql 语句执行过程图文分析

[原文链接]  http://nvd11.blog.163.com/blog/static/200018312201301310585758/ [原文视频]  http://www.jiagulun.com/thread-2674-1-1.html 1. 数据库文件Oracle 数据库文件大概可分为3种,分别是:控制文件(control files): 存放数据库本身物理结构信息数据文件(data files): 存放数据库数据啦~日志文件(log files):  包括重做日志文件和归档日志文

sql语句错误

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

SQL语句报错:You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near

报错如图: 最开始其实我的列名tname和tsubject分别叫name和subject,后来看到网上有说这个报错可能是数据库建表的时候使用了mysql的关键词,我就只把name改了.后来还是这个问题,百思不得其解. 后来同学告诉我说老师帮她检查SQL语句的问题时都是把php程序里的SQL语句先复制到mysql里面去执行看是不是数据库的问题的. 太tm机智了,我怎么没想到呢,姜还是老的辣.复制过去一看,怎么subject也是关键词啊! 很有信心的改掉以后等待正确结果,但是竟然还是这个错... 没

SQL Server 占用内存太高,查找占用内存高以及影响其性能的sql语句

当发现SQL Server 占用的资源过高,有时重启电脑也解决不了问题时,建议通过如下语句检查SQL语句的问题, 如果是当天出的问题增加{order by last_worker_time desc,想看一下今天哪些sql执行出现问题了} SELECT s2.dbid,  s1.sql_handle,  (SELECT TOP 1 SUBSTRING(s2.text,statement_start_offset / 2+1 ,  ( (CASE WHEN statement_end_offset

MySql语句性能问题定位--从sql语句到磁盘IO检查

写在前面:本文只针对IO导致MySql性能问题的定位,其他如CPU.MySql参数配置.程序自身等问题需要进一步补充. 背景:某条sql建表语句运行了15秒  :( Step1: 开启profiling SET profiling = 1; 关闭 SET profiling = off; 找到运行慢的sql语句ID show profiles; 查看sql语句CPU/IO等耗时具体的量化数据 show profile CPU,SWAPS,BLOCK IO,MEMORY,CONTEXT SWITC

DB2中常用SQL语句

DB2 提供了关连式资料库的查询语言sql(structured query language),是一种非常口语化.既易学又易懂的语法.此一语言几乎是每个资料库系统都必须提供的,用以表示关连式的操作,包含了资料的定义(ddl)以及资料的处理(dml).sql原来拼成sequel,这语言的原型以"系统 r"的名字在 ibm 圣荷西实验室完成,经过ibm内部及其他的许多使用性及效率测试,其结果相当令人满意,并决定在系统r 的技术基础发展出来 ibm 的产品.而且美国国家标准学会(ansi)