MSDN关于存储过程默认返回值的内容

11

有没有人能够准确指出MSDN在哪里说,如果没有错误发生,每个用户存储过程默认返回0?换句话说,当下面的示例代码作为存储过程时,我能确定吗?

IF someStatement
BEGIN
  RETURN 1
END

如果 someStatement 为 false 并且没有出现错误,应该始终返回零吗?

我知道它实际上是这样工作的,但我找不到Microsoft对此的任何明确说明。

4个回答

11
看起来在 SQL Server 2000 之前(参见 pre SQL 2000 BOL return value article),返回值可能有意义。 我查找了一些信息,想找到特定于 MS SQL 的原始返回代码列表,发现了以下内容(虽然我不知道它的真实性,而且它实际上没有列出这些值)。
因此,在阅读所有这些文章后,@return_status 看起来是一个参数,无论是否使用它,都会在执行存储过程时始终返回。根据 RETURN Books online 文章,返回代码不能为 null。

当与存储过程一起使用时,RETURN 不能返回 null 值。如果存储过程尝试返回 null 值(例如,使用 RETURN @status,当 @status 为 NULL 时),则会生成警告消息并返回值 0。

运行以下 T-SQL,可以明确显示这一点,
create Procedure Test
as
begin
DECLARE @RTN integer
Return @RTN
END
GO

Exec Test
GO

Drop Procedure Test
GO

您将收到

The 'Test' procedure attempted to return a status of NULL, which is not allowed. A status of 0 will be returned instead.

最终看起来答案是因为@return_status不能为null(当未设置时为0,或设置为NULL)...
至于所谓的SQL 7.0 BOL article中提到的错误代码,我猜想这可能是Sybase的旧保留...Sybase 5.0手册 Kris

你的SQL 7链接看起来没问题。电子互联网上有一些BOL的副本偶尔会出现在这里,但在这种情况下,它很好地做出了贡献。 - gbn

7

MSDN上的RETURN

编辑:

该链接内容如下:

当与存储过程一起使用时,RETURN不能返回空值。 如果存储过程尝试返回null值(例如,使用RETURN @status when @status is NULL),则会生成警告消息并返回0的值。

可以说没有 RETURN = RETURN NULL = RETURN 0。但是如果您没有运行RETURN NULL,则不会发出警告。 它期望返回0,因为它是一个存储过程。

此外,存储过程执行允许

EXEC @rtn = uspMyProc @p1...

因为我们总是期望一个值而不是NULL,所以必须返回某些内容。

我已经依赖于返回0了12年了,即使MSDN上没有提到。还有更多像我这样的人:-)


1
这就是我反复阅读这篇文章却找不到任何有关存储过程默认返回值的具体、精确陈述的技巧。我唯一发现的一点相关信息如下:"除非另有记录,否则所有系统存储过程都返回一个值为0的值。这表示成功,而非零值表示失败"但这仅适用于系统存储过程,而不是用户定义的存储过程。或者,也许应该将用户sp调用视为对系统sp的主要调用?但我认为这种说法相当不可信。 - Ilya
1
据我理解,你提供的文章甚至没有说明没有参数的RETURN语句会返回零值。此外,那里列出的所有示例都不包含我感兴趣的情况(第一个示例没有解释实际应该返回什么,它只是说明执行sp将被终止,而另一个示例仅涉及非零返回值)。 - Ilya

0

如果你要在客户端上切换一些逻辑,为什么不返回“0”并使其更明确呢?


4
如果已经保证会返回结果,为什么需要明确返回 "0"?这就是我的问题所在——它是否真的被保证(例如,由SQL Server遵守的某些标准),或者这种行为只是可选的或者甚至有时只是偶然的? - Ilya

0

2
这篇文章没有提到默认的返回值。那里的例子使用显式返回零来表示成功。 - Ilya
这对我很有帮助,因为它描述了不同操作类型的默认值,例如如果存储过程成功,则默认返回0。 - Muflix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接