查数据库所有存储过程的sql脚本(数据库大师成长日记)

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

查数据库所有存储过程的sql脚本(数据库大师成长日记)(1)

下面我们就以常见的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);

查数据库所有存储过程的sql脚本(数据库大师成长日记)(2)

使用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);

查数据库所有存储过程的sql脚本(数据库大师成长日记)(3)

其中@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);

查数据库所有存储过程的sql脚本(数据库大师成长日记)(4)

其中@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;

查数据库所有存储过程的sql脚本(数据库大师成长日记)(5)

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

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

希望对您有所帮助!

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页