存储过程返回值

4
使用以下代码:
ALTER PROCEDURE [dbo].[get](@i int)
AS
BEGIN
    declare @ADate datetime
    select @ADate = ADate 
    from table
    where i=@i
    and DateDiff(day ,getDate(), aDate  ) > 0
    and aDate is not null
    order by aDate asc
    return select @ADAte   
END

这会返回0(或系统日期时间的0值),这不是数据库中期望的结果。执行代码。
Declare @res datetime

exec @res = get 3

print @res

为什么?
4个回答

9

在SQL Server中,存储过程只能返回整数。如果你需要返回除了单个整数之外的任何内容,则应该使用以下方法之一(有些是由先前的答案解释的):

  • 在你的存储过程中使用SELECT语句

  • 使用输出参数

  • 使用用户定义的函数


1
尽管您没有提供答案的代码,但您按照问题要求解释了问题,这就是问题的答案。 - none

7

不需要声明一个变量并给它赋值。只需返回选择语句即可。

ALTER PROCEDURE [dbo].[get](@i int)
AS
BEGIN

    select ADate 
    from table
    where i=@i
    and DateDiff(day ,getDate(), aDate  ) > 0
    and aDate is not null
    order by aDate asc

END

需要注意的是,根据您的数据,此操作可能会返回多个值。

编辑

如果您愿意,可以按以下方式进行操作:

ALTER PROCEDURE [dbo].[get](@i int, @date datetime output)
AS
BEGIN

    select @date = ADate 
    from table
    where i=@i
    and DateDiff(day ,getDate(), aDate  ) > 0
    and aDate is not null
    order by aDate asc

END

然后你可以像这样使用它:

Declare @res datetime

exec get 3, @res

print @res

它在管理工作室中显示了正确的值,但在“执行代码”后没有返回该值。 - none

1

你应该选择这个值:

select @OADate

您的值将是第一个结果集中第一行中的第一个值。


代码 return@ADate 返回 Msg 257,级别 16,状态 3,过程 get,行 18 不允许从数据类型 datetime 隐式转换为 int。请使用 CONVERT 函数运行此查询。 - none
@none - 我的错,只有整数可以用作存储过程的返回值。请使用Select语句。 - Jamiec

0

看一下CREATE PROCEDURE

你需要使用OUTPUT子句

**OUTPUT**

Indicates that the parameter is a return parameter. The value of this option can be returned to EXEC[UTE]. Use OUTPUT parameters to return information to the calling procedure.

此外,返回单个值似乎需要调用用户定义的标量函数,而不是存储过程

1
不需要,除非你希望它成为一个输出变量而不是返回值。 - Jamiec
我放弃了,因为我无法在SQL存储过程中使用return技术,所以我只把它转换成输出。这个技术失败了。(难道只有int可以被返回吗?这是什么意思?真是鬼扯!) - none
1
@none,请查看http://msdn.microsoft.com/en-us/library/ms174998.aspx。它说明了*无条件地从查询或过程中退出。RETURN是立即且完整的,可以在任何时候用于退出过程、批处理或语句块。跟随RETURN的语句不会被执行。* - Adriaan Stander

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