动态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

XJMHXW_Y9XF5[PM1N]IL)UH错误,出现结果的原因:估计是类型的原因

declare @test1 sysname
set @test1='Field2'
select @test1 from dbo.T1

{H9RDFF%4(O{D%CUX6NDZR2错误,原因:SQL在运行时,已经是应用程序运行以后了,所以@test1没有被编译为表的列名,这种情形必须用动态SQL才能达到效果。

declare @test2 sysname
set @test2='Field2'
exec ('select '+ @test2+' from T1') 注意:执行动态sql,必须有这个括号。

HF(R[16`0F8@I7CI6Q59`KC正确

declare @test3 nvarchar(128)
set @test3='Field2'
exec ('select '+ @test3+' from T1')

}0%QYRDI)$6}2Z0{@D[_%TH正确,原因是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;

AUF[Y]Y@VH%KCLO@2B`97LN

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;

QQ截图20131028032715

注意:执行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

posted @ 2013-10-26 04:27  翱翔之鹰  阅读(20859)  评论(0编辑  收藏  举报