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使用小结的更多相关文章

  1. MyBatis动态SQL小结

    6:用于实现动态sql的元素及其用法 if+set--完成更新操作 if+where --完成多条件查询 if+完成多条件查询(替代where)或完成更新操作(替代set) choose(when,o ...

  2. MyBatis 实践 -动态SQL/关联查询

    MyBatis 实践 标签: Java与存储 动态SQL 动态SQL提供了对SQL语句的灵活操作,通过表达式进行判断,对SQL进行拼接/组装. if 对查询条件进行判断,如果输入参数不为空才进行查询条 ...

  3. PL/SQL --> 动态SQL调用包中函数或过程

    动态SQL主要是用于针对不同的条件或查询任务来生成不同的SQL语句.最常用的方法是直接使用EXECUTE IMMEDIATE来执行动态SQL语句字符串或字符串变量.但是对于系统自定义的包或用户自定的包 ...

  4. SSM框架开发web项目系列(四) MyBatis之快速掌握动态SQL

    前言 通过前面的MyBatis部分学习,已经可以使用MyBatis独立构建一个数据库程序,基本的增删查改/关联查询等等都可以实现了.简单的单表操作和关联查询在实际开的业务流程中一定会有,但是可能只会占 ...

  5. oracle中动态SQL详解

    部分内容参考网上资料 1.静态SQLSQL与动态SQL Oracle编译PL/SQL程序块分为两个种:其一为前期联编(early binding),即SQL语句在程序编译期间就已经确定,大多数的编译情 ...

  6. JAVAEE——Mybatis第二天:输入和输出映射、动态sql、关联查询、Mybatis整合spring、Mybatis逆向工程

    1. 学习计划 1.输入映射和输出映射 a) 输入参数映射 b) 返回值映射 2.动态sql a) If标签 b) Where标签 c) Sql片段 d) Foreach标签 3.关联查询 a) 一对 ...

  7. Mybatis:缓存,动态SQL,注解SQL以及动态标签使用

    1 转义字符 字符 转义 描述 < < 小于 <= <= 小于等于 > > 大于 >= >= 大于等于 <> <> 不等于 &a ...

  8. 在Oracle中执行动态SQL的几种方法

    转载:在Oracle中执行动态SQL的几种方法 以下为内容留存: 在Oracle中执行动态SQL的几种方法 在一般的sql操作中,sql语句基本上都是固定的,如:SELECT t.empno,t.en ...

  9. oracle中动态SQL使用详细介绍

    Oracle编译PL/SQL程序块分为两个种:通常静态SQL采用前一种编译方式,而动态SQL采用后一种编译方式,需要了解的朋友可以参考下     1.静态SQLSQL与动态SQL Oracle编译PL ...

随机推荐

  1. CMake实践(2)

    一,本期目标: [~@localhost t2]$ cat README this is README├── CMakeLists.txt├── COPYRIGHT├── doc│   └── hel ...

  2. hdu 5335 Walk Out(bfs+斜行递推) 2015 Multi-University Training Contest 4

    题意—— 一个n*m的地图,从左上角走到右下角. 这个地图是一个01串,要求我们行走的路径形成的01串最小. 注意,串中最左端的0全部可以忽略,除非是一个0串,此时输出0. 例: 3 3 001 11 ...

  3. HDU5787 K-wolf Number 数位dp

    分析:赛场上也知道是裸的数位dp,但是无奈刷数位dp题刷的太少了,并不能写出来 一点感想:赛后补题,看了题解的map记录状态,一脸蒙逼,也是非常的不爽,然后想看别人写的,不是递归就是写的比较乱 而且我 ...

  4. lightoj 1024 (高精度乘单精度)

    题意:给你一些数,求它们的最小公倍数,结果可能会很大. 统计出每个素因子出现的最大次数,把他们相乘即可,需要高精度. #include<cmath> #include<cstdio& ...

  5. Multiple View Geometry in Computer Vision Second Edition by Richard Hartley 读书笔记(一)

    var bdots = "../" var sequence = [ 'l1', 'l2', 'l3', 'l4' ]; Chapter1是个总览,引出了射影几何的概念,通过在欧式 ...

  6. PHP 正则表达式总结

    可以用字符作为一个通配符来代替除换行符(\n)之外的任一个字符.例如,正则表达式:.at可以与"cat"."sat"."#at"和" ...

  7. PHP的MySQL扩展:MySQL数据库概述

    来源:http://www.ido321.com/1023.html 一.SQL:结构化查询语言 SQL(Structured Query Language)是高级的非过程化变成语言,专门用于查询和修 ...

  8. CSS定位(CSS定位概述、相对定位、绝对定位、浮动)

    CSS 定位属性 CSS 定位属性允许你对元素进行定位. 属性 描述 position 把元素放置到一个静态的.相对的.绝对的.或固定的位置中. top 定义了一个定位元素的上外边距边界与其包含块上边 ...

  9. 基于easyui的验证扩展

    基于easyui的验证扩展 ##前言 自己做项目也有好几年的时间了,一直没有时间整理自己的代码,趁春节比较闲,把自己以前的代码整理了一篇.这是基于easyui1.2.6的一些验证扩展,2012年就开始 ...

  10. SSHFS

    SSHFS(SSH文件系统) 是一个文件系统客户端程序,使用它可以将远程服务器上的目录挂载在本地直接访问 可以在网站http://igikorn.com/sshfs-windows-8/内下载