玖叶教程网

前端编程开发入门

数据库大师成长日记:如何在存储过程中执行动态SQL(上篇)

朋友们,我们在写存储过程的时候,有可能会碰到这样的问题:我们需要将SQL语句作为参数传入、或者将SQL的几个部分传入再装配成完整的SQL,然后再在存储过程中执行SQL。碰到这样的问题,我们应该如何处理呢?

下面我们就以常见的SQL Server为例,说一下处理的方法。其它数据库系统,诸如MySQL、PostgreSQL等的处理方法也都大同小异。

篇幅所限,我分成两部分说明。上篇要说的,主要是不带参数的情况,使用参数的情况,请参阅下篇。举例主要使用查询select,其它insert、update、delete都是支持的,只是平时大家主要用到的可能是查询。

使用exec执行整条SQL

如果您执行的SQL语句是不带参数的,执行通过exec执行即可,如果exec在事务中,出了错误照样可以回滚的。语法如下:

exec(@sqlstr);

举例如下:

declare @mysql nvarchar(max);
set @mysql=N'select * from idata';
exec(@mysql);

使用exec执行整段拼接的SQL

整段拼接有可能把字段列表作为一部分where查询作为一部分order by排序作为一部分,在具体使用的时候,将几部分拼接成一个完整的SQL语句调用exec执行。简单参考如下:

declare @myfields nvarchar(max);
declare @myfilter nvarchar(max);
set @myfields=N' FDataID,FName,FAssis ';
set @myfilter=N' where fdataid>=1 and fdataid<=5';
exec('select'+@myfields+'from idata'+@myfilter);

其中@myfields是字段列表,@myfilter则是过滤条件。

使用exec执行变量拼接的SQL

变量拼接大同小异,只是把变量转变类型后拼接到SQL中,请看下例:

declare @mysql nvarchar(max);
declare @myid int;
set @mysql=N'select * from idata where fdataid=';
set @myid=1;
set @mysql=@mysql+cast(@myid as varchar(18));
exec(@mysql);

其中@myid是一个变量,作为内码转换成varchar后拼接在SQL中。要注意的是,在exec中是不可以直接使用cast或者convert转换的。

在存储过程中实战

下面我们通过一个简单的存储过程实战下exec的应用。

create procedure myproc(
 @myfields nvarchar(max),
 @mydataid int
)
as 
declare @mysql nvarchar(max);
begin
 set @mysql=N'select'+@myfields+
 N'from idata where fdataid='+
 cast(@mydataid as varchar(18));
 exec(@mysql);
end;
GO
exec myproc N' FDataID,FName,FAssis ',1;

其中存储过程传入两个参数,@myfields表示字段列表,@mydataid表示资料内码。

在实战中,可能比例子要复杂的多,但万变不离其宗,都是要通过拼接后调用exec的方式来执行。

希望对您有所帮助!

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言