我有一个带有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'
答案 0 :(得分:0)
在评论部分中进行了这个小聊天之后,这一切都归结为从过程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......