朋友们,我们在写存储过程的时候,有可能会碰到这样的问题:我们需要将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的方式来执行。
希望对您有所帮助!