如何将exec结果分配给sql变量?

Pra*_*bhu 97 sql t-sql sql-server stored-procedures

如何在SQL中为变量分配exec调用的结果?我有一个名为的存储过程up_GetBusinessDay,它返回一个日期.

你能做这样的事吗:

exec @PreviousBusinessDay = dbo.up_GetBusinessDay @Date, -1
Run Code Online (Sandbox Code Playgroud)

KM.*_*KM. 86

我总是使用返回值来传递错误状态.如果你需要传回一个值,我会使用输出参数.

示例存储过程,带有OUTPUT参数:

CREATE PROCEDURE YourStoredProcedure 
(
    @Param1    int
   ,@Param2    varchar(5)
   ,@Param3    datetime OUTPUT
)
AS
IF ISNULL(@Param1,0)>5
BEGIN
    SET @Param3=GETDATE()
END
ELSE
BEGIN
    SET @Param3='1/1/2010'
END
RETURN 0
GO
Run Code Online (Sandbox Code Playgroud)

使用OUTPUT参数调用存储过程:

DECLARE @OutputParameter  datetime
       ,@ReturnValue      int

EXEC @ReturnValue=YourStoredProcedure 1,null, @OutputParameter OUTPUT
PRINT @ReturnValue
PRINT CONVERT(char(23),@OutputParameter ,121)
Run Code Online (Sandbox Code Playgroud)

OUTPUT:

0
2010-01-01 00:00:00.000
Run Code Online (Sandbox Code Playgroud)

  • 通过使用OUTPUT参数,可以返回任何数据类型,存储过程中的RETURN值只能是整数. (8认同)
  • 请注意,不需要传入使用值声明的OUTPUT参数.这意味着如果您要更改现有的SP,则可以安全地执行此操作,而不会有任何损坏.例如,@ Param3 datetime ='1900-01-01'OUTPUT. (2认同)

小智 51

如果您只想返回一个整数,这将有效:

DECLARE @ResultForPos INT 
EXEC @ResultForPos = storedprocedureName 'InputParameter'
SELECT @ResultForPos
Run Code Online (Sandbox Code Playgroud)

  • -1这只会返回一个整数.OP希望返回日期.@KM接受的答案.是正确的答案,因为它使用OUTPUT而不是RETURN. (11认同)
  • 其实这很有效.关于如何获取返回的整数的示例,您可以对所有其他类型执行相同操作(不检查表是否可行,但我认为是.)我只是尝试了nvarchar(50). (4认同)
  • @Mzn`UNIQUEIDENTIFIER`只是一个例子,`RETURN`只能用于整数值,参见[docs](https://msdn.microsoft.com/en-us/library/ms174998.aspx).从SP获取其他数据的推荐方法是返回结果集或使用"OUTPUT" (3认同)
  • @Mzn*"你可以为所有其他种类做同样的事情"*,当然不适用于`UNIQUEIDENTIFIER`. (2认同)
  • @詹姆斯为什么?uniqueidentifier 数据类型有什么不同?存储过程不能返回唯一标识符? (2认同)

AZ *_*had 28

declare @EventId int

CREATE TABLE #EventId (EventId int)

insert into #EventId exec rptInputEventId

set @EventId = (select * from #EventId)

drop table #EventId 
Run Code Online (Sandbox Code Playgroud)

  • 实际上除了改变存储过程的签名之外,这里描述的唯一工作方式 (3认同)
  • @MichaelSander完全正确,所有其他解决方案都没有**正确回答OP问题.唯一的方法是保存结果的临时表. (3认同)
  • 当底层Sproc也没有输出参数时,也可以使用它作为日期.(底层的sproc在动态SQL中有另一个Exec) (2认同)
  • 只有在这里工作的方式,不需要编辑proc,我不能这样做.+1 (2认同)

Pet*_*ang 6

文档(假设您使用SQL-Server):

USE AdventureWorks;
GO
DECLARE @returnstatus nvarchar(15);
SET @returnstatus = NULL;
EXEC @returnstatus = dbo.ufnGetSalesOrderStatusText @Status = 2;
PRINT @returnstatus;
GO
Run Code Online (Sandbox Code Playgroud)

所以是的,它应该以这种方式工作.

  • 在OP的例子中,他们想要返回一个日期,存储过程只能将整数值返回给调用过程或应用程序. (8认同)