如何使用多个输出参数执行存储过程?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用多个输出参数执行存储过程?相关的知识,希望对你有一定的参考价值。
我有一个带有2个输出参数的存储过程,并希望使用SQL执行它,但在将它们分配给存储过程的结果时无法获取值。
简而言之,我有一个存储过程,它使登录用户的公司有两个输出参数。一个是整数错误代码,另一个是公司名称。此外,存储过程还返回公司所有其他用户的结果。
由于所有用户都具有相同的公司名称,因此我不希望将响应扩展到另一个字段,并认为最好将公司名称分配给变量,但无法使其正常工作。
我的SQL执行我的存储过程是:
DECLARE @parmRET1 VARCHAR(30)
DECLARE @parmRET2 int
EXECUTE CRUD_User @pvchAction = 'select',
@Id = '30862982-E189-4CE6-A299-5996D62DDCD5',
@pCompanyNameOut = @parmRET1 OUTPUT,
@pIntErrDescOut = @parmRET2 OUTPUT
SELECT @parmRET1 AS [output parameter], @parmRET2 AS [output parameter]
我的存储过程代码是:
alter PROC [dbo].[CRUD_User]
(
@Id varchar(400)=null,
@Name varchar(400)=null,
@Phone varchar(200)=null,
@PriceNotes varchar(max)=null,
@isActive bit= 0,
@pvchAction varchar(50)=null,
@pIntErrDescOut int output,
@pCompanyNameOut varchar(200) output
)
AS
BEGIN
if(@pvchAction='select')
begin
--EXEC @pCompanyNameOut = dbo.sel_Company_by_UserId @Id OUTPUT
SET @pIntErrDescOut = '3'; --works in getting output
EXEC @pCompanyNameOut = sel_Company_by_UserId @Id --not working
SELECT *
FROM aspnet_Users u
left outer join UserInfo ui on u.UserId = ui.userId
left outer join aspnet_Membership m on m.UserId = u.UserId
left outer join Company c on c.Id = ui.CompanyId
WHERE u.UserId = isnull(@Id, u.UserId) ;
RETURN
end
.....
IF (@@ERROR <> 0)
BEGIN
SET @pIntErrDescOut = 1
END
ELSE
BEGIN
SET @pIntErrDescOut = 0
END
END
从sel_Company_by_UserId中提取存储的proc sql时,一切正常:
SET @pCompanyNameOut = (select Name
from Company C inner join UserInfo ui
on C.Id = ui.CompanyId
where ui.userId = '30862982-E189-4CE6-A299-5996D62DDCD5' )
但是当我想要一个proc返回相同时失败:
"EXEC @pCompanyNameOut = sel_Company_by_UserId '30862982-E189-4CE6-A299-5996D62DDCD5'
答案
在评论部分中进行了这个小聊天之后,这一切都归结为来自过程sel_Company_by_UserId
的返回值,您不能从过程中返回除INT之外的任何其他数据类型。对于除INT数据类型以外的其他数据类型,您需要使用OUTPUT参数。
看看下面的代码。
ALTER sel_Company_by_UserId
@Id GUID,
@NameVal VARCHAR(100) OUTPUT --<-- add this param here with "OUTPUT" key word
AS
BEGIN
SET NOCOUNT ON;
select @NameVal = Name
from Company C inner join UserInfo ui
on C.Id = ui.CompanyId
where ui.userId = @Id
END
现在,一旦你更改了sel_Company_by_UserId
存储过程中的逻辑,现在在[dbo].[CRUD_User]
中进行相应的更改。
就像是
if(@pvchAction='select')
begin
SET @pIntErrDescOut = '3'; --works in getting output
EXECUTE sel_Company_by_UserId @id = @Id
, @NameVal = @pCompanyNameOut OUTPUT
..... rest of your code......
以上是关于如何使用多个输出参数执行存储过程?的主要内容,如果未能解决你的问题,请参考以下文章
oracle中怎么执行带有输出参数的存储过程,在程序中我知道怎么调用,
oracle中怎么执行带有输出参数的存储过程,在程序中我知道怎么调用,
Asp.net(C#) 获取 执行sql server 语句/存储过程后的 多个返回值?