10

如果没有错误发生,任何人都可以准确指出 MSDN 所说的每个用户存储过程默认返回 0 的位置吗?换句话说,我能否确定下面给出的示例代码是存储过程

IF someStatement
BEGIN
  RETURN 1
END

如果 someStatement 为 false 且未发生错误,则应始终返回零?

我知道它实际上是这样工作的,但我没有从微软那里找到任何明确的声明。

4

4 回答 4

10

在 SQL Server 2000 之前,返回值似乎曾经意味着某些东西(参见 SQL 2000 之前的 BOL返回值文章的参考)。我四处查看是否可以找到这些原始返回代码的列表,专门用于MS SQL,并找到以下内容(虽然我不知道它的真实性,它实际上并没有列出值)。

因此,在阅读了所有这些文章之后,看起来@return_status 是一个在执行存储过程时总是返回的参数(即使您不使用它)。根据RETURN Books 在线文章,返回代码不能为空。

与存储过程一起使用时,RETURN 不能返回空值。如果一个过程试图返回一个空值(例如,当@status 为NULL 时使用RETURN @status),则会生成一条警告消息并返回一个值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文章中提到的错误代码 ,我的猜测是 Sybase 的旧保留... Sybase 5.0 Manual

克里斯

于 2010-04-05T17:16:43.803 回答
7

在 MSDN 上返回

编辑:

链接说

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

可以说没有 RETURN = RETURN NULL = RETURN 0。但没有发出警告,因为您还没有运行RETURN NULL。预计为零,因为它是一个存储过程。

此外,存储过程执行允许

EXEC @rtn = uspMyProc @p1...

所以必须返回一些东西,因为我们总是期望一个值,而不是 NULL

即使 MSDN 没有说,我也依赖零返回 12 年。以及我们中的许多人:-)

于 2010-04-05T13:23:38.370 回答
0

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

于 2010-04-05T13:20:06.200 回答
0

使用联机丛书中的返回代码返回数据。

于 2010-04-05T13:30:33.240 回答