【问题标题】:stored procedure returning value存储过程返回值
【发布时间】:2010-12-20 11:21:33
【问题描述】:

使用此代码:

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

为什么?

【问题讨论】:

    标签: sql-server tsql stored-procedures


    【解决方案1】:

    SQL Server 中的存储过程只能返回整数。如果您需要返回单个整数以外的任何内容,那么您应该使用以下方法之一(前面的答案解释了一些):

    • 在您的过程中使用 SELECT

    • 使用输出参数

    • 改用用户定义函数

    【讨论】:

    • 虽然您没有提供答案的代码,但您按照问题中的要求解释了问题,这就是为什么这是问题的答案。
    【解决方案2】:

    无需声明变量并为其赋值。只需返回 select 语句。

    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
    

    【讨论】:

    • 确实在管理工作室中显示了当前值,但是它不返回“执行代码”之后的值
    【解决方案3】:

    您应该选择值:

    select @OADate
    

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

    【讨论】:

    • 代码 return@ADate 给出 Msg 257、Level 16、State 3、Procedure get、Line 18 不允许从数据类型 datetime 到 int 的隐式转换。使用 CONVERT 函数运行此查询。
    • @none - 我的错,只有整数可以用作 SP 的返回值。使用选择。
    【解决方案4】:

    看看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.
    

    此外,返回单个值似乎是在调用 USER DEFINED SCALAR FUNCTION,而不是 STORED PROCEDURE

    【讨论】:

    • 不,你不知道。那是除非你想要它是一个与返回值相反的输出变量。
    • 我放弃了,我只是把它变成了输出,因为我无法使用sql存储过程中的return技术。失败的技术。(难道只能返回int?,这是什么意思,wtf?)
    • @none,看看msdn.microsoft.com/en-us/library/ms174998.aspx。它声明 从查询或过程中无条件退出。 RETURN 是立即且完整的,可以在任何时候用于退出过程、批处理或语句块。 RETURN 后面的语句不会被执行。
    猜你喜欢
    • 2010-11-02
    • 2015-11-06
    • 2021-06-13
    • 2017-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多