动态SQL使用小结
1.什么是动态SQL?
静态 SQL:静态 SQL 语句一般用于嵌入式 SQL 应用中,在程序运行前,SQL 语句必须是确定的,例如 SQL 语句中涉及的列名和表名必须是存在的。静态 SQL 语句的编译是在应用程序运行前进行的,编译的结果会存储在数据库内部。而后程序运行时,数据库将直接执行编译好的 SQL 语句,降低运行时的开销。
动态 SQL:动态 SQL 语句是在应用程序运行时被编译和执行的,例如,使用 DB2 的交互式工具 CLP 访问数据库时,用户输入的 SQL 语句是不确定的,因此 SQL 语句只能被动态地编译。动态 SQL 的应用较多,常见的 CLI 和 JDBC 应用程序都使用动态 SQL。
http://www.360doc.com/content/09/1028/16/8411_7986235.shtml
动态SQL的应用场景:
1:普通SQL语句可以用Exec执行,但没有意义,反倒性能低下。
2:字段名,表名,数据库名之类作为变量时,必须用动态SQL
2.重点.
执行动态SQL有两种方法
1.使用exec命令,语法:exec sql
exec命令有两个用途,一个是用来执行存储过程,另一个是执行动态SQL
用法1:无参数的exec动态SQL
exec ('select field2 from t1')
点评:这样做其实没有意义,性能低,动态SQL最好用在数据库名,表名,字段名作为参数的时候的场景。那时必须用动态SQL才能执行。
用法2:有参数的动态SQL
declare @test nvarchar
set @test='Field2'
select @test from dbo.T1
错误,出现结果的原因:估计是类型的原因
declare @test1 sysname
set @test1='Field2'
select @test1 from dbo.T1
错误,原因:SQL在运行时,已经是应用程序运行以后了,所以@test1没有被编译为表的列名,这种情形必须用动态SQL才能达到效果。
declare @test2 sysname
set @test2='Field2'
exec ('select '+ @test2+' from T1') 注意:执行动态sql,必须有这个括号。
正确
declare @test3 nvarchar(128)
set @test3='Field2'
exec ('select '+ @test3+' from T1')
正确,原因是nvarchar(128) 和sysname等效
参见:http://www.cnblogs.com/chenxizhang/archive/2009/04/15/1436764.html
2.使用系统存储过程
语法:exec excutesql 参数1,参数2,参数3
其中参数1是要执行的动态SQL语句,参数2是输入的参数的定义,参数3是输入的参数的值
2.1Demo:
DECLARE @IntVariable INT,@SQLString NVARCHAR(500),@ParmDefinition NVARCHAR(500);
SET @SQLString =N'SELECT * FROM T1 WHERE Field2 = @Field';--给需要执行的sql赋值
SET @ParmDefinition = N'@Field int';--以字符串的形式给第二个参数赋值
ET @IntVariable = 1;--给需要传入的参数赋值
EXECUTE sp_executesql @SQLString, @ParmDefinition,@Field = @IntVariable;

DECLARE @IntVariable INT,@SQLString VARCHAR(500),@ParmDefinition VARCHAR(500);
SET @SQLString ='SELECT * FROM T1 WHERE Field2 = @Field';--给需要执行的sql赋值
SET @ParmDefinition = '@Field int';--给需要传入的参数进行定义
SET @IntVariable = 1;--给需要传入的参数赋值
EXECUTE sp_executesql @SQLString, @ParmDefinition,@Field = @IntVariable;

注意:执行sp_executesql ,它的3个参数必须是可以隐式转换为nvarchar类型的参数,否则报错。如果没有定义,可以在参数赋值的前面+N
2.2 sp_executesql 的优点:
sp_executesql 支持替换 Transact-SQL 字符串中指定的任何参数值,但 EXECUTE 语句不支持。因此,由 sp_executesql 生成的 Transact-SQL 字符串比那些由 EXECUTE 语句生成的字符串更加相似。SQL Server 查询优化器可能将 sp_executesql 的 Transact-SQL 语句与以前所执行的语句的执行计划相匹配,从而节省编译新的执行计划的开销。
参考资料:
http://msdn.microsoft.com/zh-cn/library/ms175170.aspx
http://blog.csdn.net/Tercel99/article/details/2901550
http://www.jcwcn.com/article-28686-1.html
http://www.51testing.com/html/46/n-223846.html
动态SQL使用小结的更多相关文章
- MyBatis动态SQL小结
6:用于实现动态sql的元素及其用法 if+set--完成更新操作 if+where --完成多条件查询 if+完成多条件查询(替代where)或完成更新操作(替代set) choose(when,o ...
- MyBatis 实践 -动态SQL/关联查询
MyBatis 实践 标签: Java与存储 动态SQL 动态SQL提供了对SQL语句的灵活操作,通过表达式进行判断,对SQL进行拼接/组装. if 对查询条件进行判断,如果输入参数不为空才进行查询条 ...
- PL/SQL --> 动态SQL调用包中函数或过程
动态SQL主要是用于针对不同的条件或查询任务来生成不同的SQL语句.最常用的方法是直接使用EXECUTE IMMEDIATE来执行动态SQL语句字符串或字符串变量.但是对于系统自定义的包或用户自定的包 ...
- SSM框架开发web项目系列(四) MyBatis之快速掌握动态SQL
前言 通过前面的MyBatis部分学习,已经可以使用MyBatis独立构建一个数据库程序,基本的增删查改/关联查询等等都可以实现了.简单的单表操作和关联查询在实际开的业务流程中一定会有,但是可能只会占 ...
- oracle中动态SQL详解
部分内容参考网上资料 1.静态SQLSQL与动态SQL Oracle编译PL/SQL程序块分为两个种:其一为前期联编(early binding),即SQL语句在程序编译期间就已经确定,大多数的编译情 ...
- JAVAEE——Mybatis第二天:输入和输出映射、动态sql、关联查询、Mybatis整合spring、Mybatis逆向工程
1. 学习计划 1.输入映射和输出映射 a) 输入参数映射 b) 返回值映射 2.动态sql a) If标签 b) Where标签 c) Sql片段 d) Foreach标签 3.关联查询 a) 一对 ...
- Mybatis:缓存,动态SQL,注解SQL以及动态标签使用
1 转义字符 字符 转义 描述 < < 小于 <= <= 小于等于 > > 大于 >= >= 大于等于 <> <> 不等于 &a ...
- 在Oracle中执行动态SQL的几种方法
转载:在Oracle中执行动态SQL的几种方法 以下为内容留存: 在Oracle中执行动态SQL的几种方法 在一般的sql操作中,sql语句基本上都是固定的,如:SELECT t.empno,t.en ...
- oracle中动态SQL使用详细介绍
Oracle编译PL/SQL程序块分为两个种:通常静态SQL采用前一种编译方式,而动态SQL采用后一种编译方式,需要了解的朋友可以参考下 1.静态SQLSQL与动态SQL Oracle编译PL ...
随机推荐
- CMake实践(2)
一,本期目标: [~@localhost t2]$ cat README this is README├── CMakeLists.txt├── COPYRIGHT├── doc│ └── hel ...
- hdu 5335 Walk Out(bfs+斜行递推) 2015 Multi-University Training Contest 4
题意—— 一个n*m的地图,从左上角走到右下角. 这个地图是一个01串,要求我们行走的路径形成的01串最小. 注意,串中最左端的0全部可以忽略,除非是一个0串,此时输出0. 例: 3 3 001 11 ...
- HDU5787 K-wolf Number 数位dp
分析:赛场上也知道是裸的数位dp,但是无奈刷数位dp题刷的太少了,并不能写出来 一点感想:赛后补题,看了题解的map记录状态,一脸蒙逼,也是非常的不爽,然后想看别人写的,不是递归就是写的比较乱 而且我 ...
- lightoj 1024 (高精度乘单精度)
题意:给你一些数,求它们的最小公倍数,结果可能会很大. 统计出每个素因子出现的最大次数,把他们相乘即可,需要高精度. #include<cmath> #include<cstdio& ...
- Multiple View Geometry in Computer Vision Second Edition by Richard Hartley 读书笔记(一)
var bdots = "../" var sequence = [ 'l1', 'l2', 'l3', 'l4' ]; Chapter1是个总览,引出了射影几何的概念,通过在欧式 ...
- PHP 正则表达式总结
可以用字符作为一个通配符来代替除换行符(\n)之外的任一个字符.例如,正则表达式:.at可以与"cat"."sat"."#at"和" ...
- PHP的MySQL扩展:MySQL数据库概述
来源:http://www.ido321.com/1023.html 一.SQL:结构化查询语言 SQL(Structured Query Language)是高级的非过程化变成语言,专门用于查询和修 ...
- CSS定位(CSS定位概述、相对定位、绝对定位、浮动)
CSS 定位属性 CSS 定位属性允许你对元素进行定位. 属性 描述 position 把元素放置到一个静态的.相对的.绝对的.或固定的位置中. top 定义了一个定位元素的上外边距边界与其包含块上边 ...
- 基于easyui的验证扩展
基于easyui的验证扩展 ##前言 自己做项目也有好几年的时间了,一直没有时间整理自己的代码,趁春节比较闲,把自己以前的代码整理了一篇.这是基于easyui1.2.6的一些验证扩展,2012年就开始 ...
- SSHFS
SSHFS(SSH文件系统) 是一个文件系统客户端程序,使用它可以将远程服务器上的目录挂载在本地直接访问 可以在网站http://igikorn.com/sshfs-windows-8/内下载