发布时间:2026-06-22阅读(2)
朋友们,我们在写存储过程的时候,有可能会碰到这样的问题:我们需要将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=Nselect * from idata;exec(@mysql);

整段拼接有可能把字段列表作为一部分、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=Nselect * 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=Nselect @myfields Nfrom idata where fdataid= cast(@mydataid as varchar(18)); exec(@mysql);end;GOexec myproc N FDataID,FName,FAssis ,1;

其中存储过程传入两个参数,@myfields表示字段列表,@mydataid表示资料内码。
在实战中,可能比例子要复杂的多,但万变不离其宗,都是要通过拼接后调用exec的方式来执行。
希望对您有所帮助!
Copyright © 2024 有趣生活 All Rights Reserve吉ICP备19000289号-5 TXT地图HTML地图XML地图