动态 SQL

SQL Server 允许用字符串来动态构造 T-SQL 代码的一个批处理,接着再执行这个批处理。这种功能称为动态SQL (dynamic SQL)。SQL Server提供了两种执行动态 SQL 的方法:使用 EXEC(EXECUTE 的缩写)命令和sp_executesql 存储过程。

动态SQL 可以用于以下几种用途:

♦ 自动化管理任务。例如,对于数据库实例中的每个数据库,查询其元数据,为其执行 BACKUP DATABASE 语句。

♦ 改善特定任务的性能。例如,构造参数化的特定查询,以重用以前缓存过的执行计划。

♦ 在对实际数据进行查询的基础上,构造代码元素。例如,当事先不知道在PIVOT运算符的IN子句中应该出现哪些元素时,动态构造PIVOT查询。

注意:当把用户的输入拼接为代码中的一部分时,要特别小心。黑客们经常会试图注入(inject )你不想运行的代码。要防止SQL注入,最好的办法就是避免将用户输入拼接为代码的一部分(例如,通过使用参数)。但是如果你确实需要将用户的输入拼接为代码的一部分,务必对用户的输入进行彻底检查,看看有没有SQL注入的企图。

1. EXEC 命令

EXEC 命令是T-SQL中最早提供的一种用于执行动态SQL 的方法。EXEC 接受一个字符串作为在圆括号中输入的参数,执行字符串中包含的批处理代码。EXEC 命令的输入既支持普通字符,也支持Unicode字符。

EXEC(‘SELECT * FROM dbo.Categories‘);

2. sp_executesql 存储过程

sp_executesql 存储过程是继EXEC命令之后引入的另一种执行动态SQL 的方法。从sp_executesql的调用接口来说,使用这个存储过程更安全和更灵活,因为它支持输入和输出参数。

注意:与EXEC命令不同的是,sp_executesql 存储过程只支持使用 Unicode字符串作为其输入的批处理代码。

正因为在动态 SQL 代码中可以使用输入的输出参数,这样就有助于写出更安全和更有效的代码。从安全性的角度来说,在代码中出现的参数并不是代码的一部分,而只是表达式中的运算对象。所以,通过使用参数,就可以不必受SQL 注入的困扰了。

sp_executesql 存储过程在执行性能上要比EXEC命令更好,因为它的参数化有助于重用缓存过的执行计划。执行计划是SQL Server为查询生成的物理处理计划,包含了一组指令,说明要访问哪些对象、以什么顺序、使用哪个索引、如何访问它们、使用什么联接算法、等等。为了简化处理,如果要重用以前缓存过的执行计划,必须满足的条件之一就是查询字符串应该和缓存中已经存在的执行计划的查询字符串相同。所以,有效重用查询执行计划最好的方法就是使用带有参数的存储过程。这样一来,即使参数值发生了变化,可查询字符串仍然保持相同。但如果你出于自己的原因而决定使用特定的代码,而不使用存储过程,至少你仍然可以尽可能地使用参数。只不过如果使用sp_executesql则会增加重用执行计划的机会。

sp_executesql 存储过程有两个输入参数和一个参数赋值部分。在第一个参数@stmt中,需要指定包含想要运行的批处理代码的Unicode字符串。第二个参数@params是一个Unicode字符串,包含@stmt中所有输入和输出参数的声明。接着为输入和输出参数指定取值,各参数之间用逗号分隔。

EXEC sp_executesql @stmt=N‘SELECT orderid ,custid FROM dbo.Orders WHERE [email protected];‘,

          @params=N‘@orderid AS INT‘,

          @orderid=10246;

动态 SQL,布布扣,bubuko.com

时间: 2024-11-10 00:18:14

动态 SQL的相关文章

MyBatis4:动态SQL

什么是动态SQL MyBatis的一个强大特性之一通常是它的动态SQL能力.如果你有使用JDBC或其他相似框架的经验,你就明白条件串联SQL字符串在一起是多么地痛苦,确保不能忘了空格或者在列表的最后的省略逗号,动态SQL可以彻底处理这种痛苦. 通常使用动态SQL不可能是独立的一部分,MyBatis当然使用一种强大的动态SQL语言来改进这种情形,这种语言可以被用在任意映射的SQL语句中. 动态SQL元素和使用JSTL或其它相似的基于XML的文本处理器相似,在MyBatis之前的版本中,有很多元素需

MyBatis动态SQL小结

p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-bottom: .0001pt; text-align: justify; font-size: 10.5pt; font-family: 等线 } .MsoChpDefault { font-family: 等线 } div.WordSection1 { } ol { margin-bottom: 0cm } ul { margin-bottom: 0cm } Mybati

笔记:MyBatis 动态SQL

有时候,静态的SQL语句并不能满足应用程序的需求.我们可以根据一些条件,来动态地构建SQL语句.例如,在Web应用程序中,有可能有一些搜索界面,需要输入一个或多个选项,然后根据这些已选择的条件去执行检索操作.在实现这种类型的搜索功能,我们可能需要根据这些条件来构建动态的SQL语句.如果用户提供了任何输入条件,我们需要将那个条件 添加到SQL语句的WHERE子句中. MyBatis通过使用<if>,<choose>,<where>,<foreach>,<

MyBatis 动态sql详解

MyBatis的动态sql语句 1.if 条件 2.choose , when 和 otherwise条件 3.where 条件 where条件:1.自动加上where.2.如果where子句以and或者or开头,则自动删除第一个and或者or..所以我们不需要自己加where 4.trim 条件 trim条件和where条件类似但是功能更强大:不仅可以替换掉子句开头的and或者or,还提供了加前缀和后缀的功能. 5.forEach循环 6.set 条件 set条件:自动加上set,自动去除最后

db2存储过程动态sql被截断

编写存储过程,使用动态sql时,调试时发现变量赋值后被截断. 关键代码如下: 实现的效果是先把上下游做对比的sql语句和相关参数存入RKDM_DATA_VOID_RULE, 执行存储过程后把两个sql语句得出的结果插入另一张结果表RKDM_DATA_VOID_CHK_REST. 建表语句: CREATE TABLE RKDM_DATA_VOID_CHK_REST ( DATA_DT DATE, ORDR_NUM INTEGER, CHK_BIG_CLS VARCHAR(256), DATA_PR

mybatis入门-动态sql

什么是动态sql 判断的动态sql mybatis核心就是对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. 现有需求如下:需要查询用户,输入的是用户类,如果用户的性别类不为空,则将性别作为查询条件之一,如果用户的姓名不为空,则将用户姓名作为查询条件之一.如果用户两个属性都为空,则查询所有用户. 我们知道,在mapper中,我们的传入参数只有一个,多个参数只能通过包转类来实现,现在这种问题怎么解决呢?答案就是在xml文件中加入判断,使sql语句动态生成.刚才的需求所对应的

MyBatis的动态SQL详解

MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑,本文详解mybatis的动态sql,需要的朋友可以参考下 MyBatis 的一个强大的特性之一通常是它的动态 SQL 能力.如果你有使用 JDBC 或其他 相似框架的经验,你就明白条件地串联 SQL 字符串在一起是多么的痛苦,确保不能忘了空 格或在列表的最后省略逗号.动态 SQL 可以彻底处理这种痛苦. 通常使用动态SQL不可能是独立的一部分,MyBatis当然使用一种强大的动态SQL语言来改进这种

动态SQL

一 动态SQL /* 1.动态SQL概念的内涵 2.实现动态SQL的元素 3.if语句节点 4.choose(when,otherwise)语句节点 5.where节点 6.trim节点 7.set节点(update的set子句) 8.foreach节点 */ 1.动态SQL概念的内涵 MyBatis 最强大的特性之一就是它的动态语句功能,使用动态SQL完成多条件查 询.MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL 语中实现某些逻辑. 2.实现动态SQL的元素

mybatis——动态sql

MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑. MyBatis中用于实现动态SQL的元素主要有: if choose(when,otherwise) trim where set foreach if就是简单的条件判断,利用if语句我们可以实现某些简单的条件选择.先来看如下一个例子: 01 <select id="dynamicIfTest" parameterType="Blog" resultType=&

8.mybatis动态SQL模糊查询 (多参数查询,使用parameterType)

多参数查询,使用parameterType.实例: 用户User[id, name, age] 1.mysql建表并插入数据 2.Java实体类 public class User { public User() { } public User(int id, String name, int age) { super(); this.id = id; this.name = name; this.age = age; } private int id; private String name;