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. 【转】linux线程模型

    一.定义 关于进程.轻量级进程.线程.用户线程.内核线程的定义,这个很容易找到,但是看完之后你可以说你懂了,但实际上你真的明白了么? 在现代操作系统中,进程支持多线程.进程是资源管理的最小单元:而线程 ...

  2. ADO.NET访问SQL Server调用存储过程带回参

    1,ADO.NET访问SQL Server调用存储过程带回参 2,DatabaseDesign  use northwind go --存储过程1 --插入一条商品 productname=芹菜 un ...

  3. 翻译【ElasticSearch Server】第一章:开始使用ElasticSearch集群(1)

    我们要做的第一件事是安装ElasticSearch.对于多数应用程序,您开始安装和配置,通常忘记这些步骤的重要性,直到发生了糟糕的事情.这章我们将广泛关注ElasticSearch的这部分.请注意本章 ...

  4. 【ActiveX】实现安全接口

    转自:http://www.cnblogs.com/carekee/articles/1772201.html 感谢原作者! ActiveX控件打包成cab后,在脚本中调用中时,要保证控件的安全性才能 ...

  5. 【原】Storm 入门教程目录

    Storm入门教程 1. Storm基础 Storm Storm主要特点 Storm基本概念 Storm调度器 Storm配置 Guaranteeing Message Processing(消息处理 ...

  6. MFC记住上次路径---遇到的一些问题

    今天完成一个需求,就是记住用户选择的文件路径,先是熟悉代码,然后在网上找解决方法,一开始感觉没什么,网上的方法差不多,应该很容易做出来,结果真是卡了一半天,到晚上自己才慢慢的搞清楚了. 遇到的问题真不 ...

  7. 在Raspberry Pi上安装XBMC

    2013-05-22 XBMC is a free and open source media player application developed by the XBMC Foundation, ...

  8. mongodb 新建用户 -摘自网络

    随着版本的更新,对在使用mongodb的业务也进行了版本升级,但是在drop掉一个数据库时,问题来了,原来的用户随着删除库也被删除掉,但是再想通过原来的语法db.addUser()添加,一直报错,提示 ...

  9. homework6-更加简单的题目

    又把时间搞错了 以为这次要写客户端程序的博客 没想到这次是“怎么吃” 言归正传 cnblog上面有很多技术博客 http://perhaps.cnblogs.com/archive/2005/08/0 ...

  10. (转)UML常用图的几种关系的总结

    在UML的类图中,常见的有以下几种关系: 泛化(Generalization),  实现(Realization), 关联(Association), 聚合(Aggregation), 组合(Comp ...