动态SQL语句,就是在SQL中执行动态构建的SQL语句,在SQL SERVER中是EXECUTE函数,在ORACLE中是EXECUTE IMMEDIATE。

由于C、C++是编译型的语言,所以如果你想在运行时指定某些代码,比如说你想读取一个文本文件并执行其中的内容,比如从文件中读到"printf("hello world!");"就打印“hello world!”,这在编译型的语言中是不可能直接做到的,但解释型语言就有可能,TSQL和PLSQL都是解释型的语言,他们都提供了这样的功能,当然,这种动态执行的功能大部分情况都是用在存储过程中,下面是一个简单的例子。

CREATE PROCEDURE dbo.sp_readtable

@strresult varchar(100) output,

@tbname varchar(20)

AS

BEGIN

if exists (select * from sysobjects where name = @tbname and xtype='U')//判断表名是不是存在

begin

exec ('select * from ' + @tbname)

select @strresult = 'Task completed!'

end

else

begin

select @strresult = 'Incorrect table name'

end

END

这个存储过程是工作在SQL SERVER下的,作用很简单,就是任意提供一个表名,返回它的所有记录,@tbname是表名的输入参数,@strresult是工作结果的输出参数

在实际工作过程中,有很多比较复杂的DB操作,用一般的JOIN和UNION操作不可能完成任务,当然我们也可以将任务分拆开来,在CLIENT端一步一步的做,但在某些情况下,比如说工作的中间结果集非常巨大而且次数很多,而真正的最终数据却很小,如果将逻辑全部放在CLIENT断,会带给CLIENT和DATABASE之间很大的传输压力,在这种情况下,存储过程就体现了它的性能优势,由于逻辑比较复杂,在存储过程将可能不可避免的用到临时表和各种组合查询,而在某些情况下,组合查询的最终执行算法并不是最优算法(因为DATABASE的算法分析要包容所有的情况),特别是用IN做为范围条件时,在这种条件下,使用动态SQL代替组合查询,往往能很大地提高性能。

posted on 2007-11-24 13:11  恩恩爸爸  阅读(1170)  评论(0编辑  收藏  举报