为什么这个简单proc的输出会改变数据类型?

时间:2011-06-09 18:13:56

标签: sql-server sql-server-2005

在测试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

4 个答案:

答案 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