由于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代替组合查询,往往能很大地提高性能。