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

在上篇中,我们讲述了在存储过程中执行不带参数的动态SQL的方法,本篇我们主要讲述如何在存储过程中执行带参数的动态SQL。




存储过程如何调用java接口 存储过程调用sql_执行存储过程授权


exec(@sqlstr)只可以执行Prepared SQL,也就是不带参数的确定性SQL语句,如果要执行包含参数的动态SQL,则需要使用sp_executesql。exec可以看作是SQL Server的一个命令,而sp_executesql是系统存储过程,本身就需要调用exec来执行。

sp_executesql的语法格式为:

exec sp_executesql 动态SQL,'参数定义列表',参数列表

参数可以包含单个或多个,可以是传入参数、也可以是传出参数,下面我们就由浅入深的介绍下每种方式的调用方法。

在动态SQL中使用单个传入参数

先上一个简单的例子:

declare @mysql nvarchar(max);declare @myid int;set @myid=1;set @mysql=N'select * from idata where fdataid>=@dataid';exec sp_executesql @mysql,--可直接是动态SQL字符串N'@dataid int',--参数定义@myid;--也可@dataid=1


存储过程如何调用java接口 存储过程调用sql_SQL_02


从上例可以看出,@mysql就是待执行的动态SQL;N'@dataid int'就是参数定义;而@myid则是对应的传入参数。这种方式使用了显性参数,也就是先定义后使用,如果想要更简单,可以使用隐性参数直接赋值的方式,一旦使用了隐形参数直接赋值,则参数列表中所有参数都必须使用这种方式。

在动态SQL中使用多个传入参数

如果需要多个参数,在参数列表定义部分,需要使用逗号隔开,后面的参数列表也要传入对应的参数。脚本我就不贴了,参看下图:


存储过程如何调用java接口 存储过程调用sql_SQL_03


上图中的动态SQL中包含两个传入参数,分别是@dataid和@name,在后面的参数列表中,直接使用隐性传入参数直接赋值的方式。

在动态SQL中使用传出参数

上面的两个例子介绍了使用传入参数的方法,我们再来说说如何使用传出参数。

其实也很简单,最重要的是要在参数定义时指定output关键字,参数列表中也需要指定output关键字。如果是显性定义输入参数,在参数列表中直接调用,如果使用隐性参数直接赋值的方式,输出参数需要使用隐形参数=显性参数的格式输出。

参看下例:

declare @mysql nvarchar(max);declare @mycount int;set @mysql=N'select @count=count(*) from idata where fdataid>=@dataid and FName=@name';exec sp_executesql @mysql,--SQL语句N'@dataid int,@name nvarchar(max),@count int output',@dataid=1,@name='塑力缆',@count=@mycount output;


存储过程如何调用java接口 存储过程调用sql_存储过程如何调用java接口_04


希望对您有所帮助!