存储过程的output参数
在SSIS的Execute SQL Task组件中执行存储过程,想要返回单行的结果,总是无法返回查询的结果,返回的错误是无法把DBNull转换为String类型:
The type of the value (DBNull) being assigned to variable "User::MailBody" differs from the current variable type (String). Variables may not change type during execution. Variable types are strict, except for variables of type Object
对于这个错误,暂不做深入的调查。存储过程返回执行的结果,可以是通过返回值、基础表来实现,当然也可以通过output参数来实现。
在创建存储过程时,必须通过output关键字显式声明输出型参数。对于输出型参数,既可以接收值,也既可以不接收值,但是必须被赋值为变量,用于向外输出结果。没有用output关键字声明的参数是输入型参数,对于输入型参数,只接收值,不向外输出结果。
第一步:在存储过程中定义output参数 @para,声明输出型参数的格式如下所示:
@para data_type output
举个例子,创建一个存储过程,定义参数@p2为输出型参数,默认情况下,@p1是输入型参数:
create proc sp_name @p1 int, @p2 int output
第二步:在存储过程中对output参数赋值,注意,在存储过程返回前,必须对output参数赋值,否则存储过程会抛出异常
set @p2=value
第三步:调用存储过程,获得output参数的值
声明一个变量@var,通过变量来获得output参数的值,注意:在调用存储过程时,必须通过output关键字显式声明输出参数。
declare @var data_type exec sp_name @p1=1, @p2 = @var output
对于output参数,必须赋值为变量,变量可以初始化,也可以不初始化。
1,当变量被初始化时
如果变量已经初始化,那么输出型参数接收了变量的值,和普通的输入型参数的用法相同,可以在存储过程中直接引用output参数的值。如下所示,可以在存储过程sp_name中引用@p2的值:
declare @var data_type set @var=2 exec sp_name @p1=1, @p2 = @var output
2,当变量未初始化时
如果变量未被初始化,那么在存储过程中,不可以直接引用output参数的值,只有输出参数@p2被赋值之后,才可以引用。
declare @var data_type exec sp_name @p1=1, @p2 = @var output
参考文档: