在测试procs的输出值时,为什么最终的select @TestValOut
会返回0
而不是null
或空字符串?
我理解这样做的正确方法是使用OUTPUT
参数,因此问题确实变为: 为什么执行时@TestValOut
设置值的数据类型,一个整数?
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'Custom.test') AND type in (N'P', N'PC'))
DROP PROCEDURE Custom.test
GO
CREATE PROCEDURE Custom.test (
@CurrentUserID INT = 1
)
As
Declare @TestValIn varchar(max)
select @TestValIn='asdf'
GO
BEGIN TRAN
Declare @TestValOut varchar(max)
set @TestValOut='ffff'
Exec @TestValOut=Custom.test @CurrentUserID=1
select @TestValOut
ROLLBACK
答案 0 :(得分:4)
存储过程中的返回值始终是整数,事实上您只能使用带有返回值的整数。你看到0表示proc正确执行的事实,这是SQL Server返回的返回值,告诉你proc执行的结果是什么
为了好玩,在proc中执行select 1/0
,你会发现它不再是0
见这里
Is a return value of 0 always a success in stored procedures?
以下是该答案的例子
CREATE PROC pr_test AS
SELECT 1/0
RETURN 0
GO
现在运行它
DECLARE @i INT
exec @i = pr_test
SELECT @i -- will be 0
DROP PROC pr_test
现在让我们在没有return语句
的情况下再次这样做CREATE PROC pr_test2 AS
SELECT 1/0
GO
DECLARE @i INT
exec @i = pr_test2
SELECT @i -- will be - 6
最好使用output parameter
传回状态和/或消息
答案 1 :(得分:2)
我认为你要做的是使用输出参数,应该这样做。
CREATE PROCEDURE Custom.test (
@CurrentUserID INT = 1,
@TestValOut varchar(max) OUTPUT
)
As
select @TestValOut='asdf'
GO
BEGIN TRAN
Declare @TestValOut varchar(max)
Exec Custom.test @CurrentUserID=1, @TestValOut OUTPUT
select @TestValOut
ROLLBACK
答案 2 :(得分:1)
@TestValOut被赋予将返回的值,返回“RETURN”,如下所示:
CREATE PROCEDURE Custom.test (
@CurrentUserID INT = 1
)
As
Declare @TestValIn varchar(max)
select @TestValIn='asdf'
RETURN --defaults to zero, this is the value
GO
或
CREATE PROCEDURE Custom.test (
@CurrentUserID INT = 1
)
As
Declare @TestValIn varchar(max)
select @TestValIn='asdf'
RETURN 0 --this is the value
GO
您的存储过程实际上根本没有做任何事情:没有结果集。要看到差异......
CREATE PROCEDURE Custom.test (
@CurrentUserID INT = 1
)
As
select * from sys.objects
RETURN 42 --random value
GO
DECLARE @rtn int
EXEC @rtn = Custom.test
--you have the output of sys.objects now
--and the scalar RETURN value
SELECT @rtn
答案 3 :(得分:0)
您需要明确说明要返回的值。默认值为0
CREATE PROCEDURE Custom.test (
@CurrentUserID INT = 1
)
As
Declare @TestValIn varchar(max)
select @TestValIn='asdf'
RETURN 0
GO