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

如何将exec结果分配给sql变量?,sql,sql-server,tsql,stored-procedures,Sql,Sql Server,Tsql,Stored Procedures,如何将exec调用的结果分配给SQL中的变量?我有一个名为up\u GetBusinessDay的存储过程,它返回一个日期 你能这样做吗: exec @PreviousBusinessDay = dbo.up_GetBusinessDay @Date, -1 从(假设您使用SQL Server): 所以是的,它应该是这样工作的。我总是使用返回值来传回错误状态。如果需要传回一个值,我会使用输出参数 示例存储过程,带有一个输出参数: CREATE PROCEDURE YourStoredProce

如何将exec调用的结果分配给SQL中的变量?我有一个名为
up\u GetBusinessDay
的存储过程,它返回一个日期

你能这样做吗:

exec @PreviousBusinessDay = dbo.up_GetBusinessDay @Date, -1
从(假设您使用SQL Server):


所以是的,它应该是这样工作的。

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

示例存储过程,带有一个输出参数:

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
DECLARE @OutputParameter  datetime
       ,@ReturnValue      int

EXEC @ReturnValue=YourStoredProcedure 1,null, @OutputParameter OUTPUT
PRINT @ReturnValue
PRINT CONVERT(char(23),@OutputParameter ,121)
使用输出参数调用存储过程:

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
DECLARE @OutputParameter  datetime
       ,@ReturnValue      int

EXEC @ReturnValue=YourStoredProcedure 1,null, @OutputParameter OUTPUT
PRINT @ReturnValue
PRINT CONVERT(char(23),@OutputParameter ,121)
输出:

0
2010-01-01 00:00:00.000

如果您只想返回一个整数,这将起作用:

DECLARE @ResultForPos INT 
EXEC @ResultForPos = storedprocedureName 'InputParameter'
SELECT @ResultForPos

我也有同样的问题。虽然这里有很好的答案,但我决定创建一个表值函数。使用表(或标量)值函数,您不必更改存储的过程。我只是从表值函数中进行了选择。请注意,参数(MyParameter是可选的)

要为变量赋值,只需执行以下操作:

Declare @MyDate datetime;
SET @MyDate = (SELECT DateValue FROM MyDateFunction(@MyParameter));
也可以使用标量值函数:

CREATE FUNCTION TestDateFunction()  
RETURNS datetime  
BEGIN  
    RETURN (SELECT GetDate());
END
然后你可以简单地做

Declare @MyDate datetime;
SET @MyDate = (Select dbo.TestDateFunction());
SELECT @MyDate;

下面是动态查询的解决方案

例如,如果有更多具有不同后缀的表:

dbo.SOMETHINGTABLE_ONE, dbo.SOMETHINGTABLE_TWO
代码:


在OP的示例中,存储过程希望返回日期,而存储过程只能向调用过程或应用程序返回整数值。这是不正确的。该文档讨论的是标量函数。OP询问一个存储过程及其结果集@公里。注意,即使源文档也将返回值赋给nvarchar(15),而不是int。通过使用输出参数,您可以返回任何数据类型,存储过程的返回值只能是整数。只需注意,使用值声明的输出参数不需要传入。这意味着,如果要更改现有SP,您可以安全地执行此操作,而无需冒任何损坏的风险。例如,@Param3 datetime='1900-01-01'输出。-1这将只返回一个整数。OP想要返回一个日期。被接受的答案是@KM。是正确的答案,因为它使用输出而不是返回。实际上这是有效的。关于如何获取返回的整数的示例,您可以对所有其他类型执行相同的操作(没有检查表是否可行,但我认为是的。)我只是对nvarchar(50)进行了尝试。@Mzn“您可以对所有其他类型执行相同的操作”,当然不适用于
UNIQUEIDENTIFIER
@James Why?uniqueidentifier数据类型有什么不同?存储过程不能返回UNIQUEIDENTIFIER?@Mzn
UNIQUEIDENTIFIER
只是一个例子,
return
设计为只处理整数值,请参阅。从SP获取其他数据的推荐方法是返回结果集或使用
输出
,实际上,除了更改存储过程的签名之外,这里描述的唯一工作方法也是在基础存储过程也没有输出参数的日期使用此方法。(底层存储过程中有另一个来自dynamic SQL的执行者)@MichaelSander完全正确,所有其他解决方案都没有正确回答OPs问题。唯一的方法是一个临时表来保存结果。唯一的方法是在这里工作,而不需要编辑过程,这在我的情况下是无法做到的+1您也可以使用表变量代替临时表。这非常适合我的情况-谢谢
dbo.SOMETHINGTABLE_ONE, dbo.SOMETHINGTABLE_TWO
DECLARE @INDEX AS NVARCHAR(20)
DECLARE @CheckVALUE AS NVARCHAR(max) = 'SELECT COUNT(SOMETHING) FROM 
dbo.SOMETHINGTABLE_'+@INDEX+''
DECLARE @tempTable Table (TempVALUE int)
DECLARE @RESULTVAL INT

INSERT INTO @tempTable
    EXEC sp_executesql @CheckVALUE

SET @RESULTVAL = (SELECT * FROM @tempTable)

DELETE @tempTable

SELECT @RESULTVAL