动态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 ...
随机推荐
- IT版孔乙己(转)
[不要做学究]回忆孔先生IT版 我关于本文评价:看到这篇文章很多人会生出这样的疑问“这明明是在诋毁钻研技术的人嘛?是不是在宣扬技术无用论?”. 初看这篇文章的时候我也是这样的想法,但是逐步才明白这篇文 ...
- Andriod中绘(画)图----Canvas的使用详解
http://blog.csdn.net/qinjuning/article/details/6936783
- Brackets sequence
题意: 给你一个括号序列(有中小括号),求出以给定序列为子序列的最小合法括号序列. 分析: 非常经典,以前做过相似一道题,用区间dp,但怎么把这个序列求出来没想出来. dp[i][j]表示区间i-j是 ...
- NSarray 赋值 拷贝 等问题记录
1. NSArray * a1 = @[@"1",@"2",@"3"]; NSArray * a2 = a1; a1跟a2所指向的地址是一样 ...
- 求职基础复习之快速排序c++版
#include<iostream> using namespace std; int partition(int a[],int p,int q){ int x = a[q]; ; fo ...
- jQuery Mobile入门教程
简介:jQuery Mobile框架可以轻松的帮助我们实现非常好看的.可跨设备的Web应用程序.我们将后续的介绍中向大家介绍大量的代码及实例. jQuery一直以来都是非常流行的富客户端及Web应用程 ...
- ACM1994
/* Problem Description 为自行解决学费,chx勤工俭学收入10000元以1年定期存入银行,年利率为3.7% .利率按年计算,表示100元存1年的利息为3.7元.实际上有时提前有时 ...
- [Hive - Tutorial] Built In Operators and Functions 内置操作符与内置函数
Built-in Operators Relational Operators The following operators compare the passed operands and gene ...
- 最大二位子数组和问题(homework-02)
前面已经谈过最大一维子数组和问题,这里面扩展到二维. 一. 常规情况 一个矩形的数组,找到一个矩形的子数组有最大的元素和,求这个和. 1. 从朴素算法入手,枚举矩形数组的4个顶点,以此计算其数组和.同 ...
- struts2+Hibernate4+spring3+EasyUI环境搭建之二:搭建spring
三.搭建spring3 1.引入spring3依赖 <!-- spring3 --> <dependency> <groupId>org.springframewo ...