在一行中声明和分配存储过程的结果

时间:2018-07-21 17:47:36

标签: sql-server tsql

是否可以在一个语句中声明和分配sp的结果? 如果可以,

DECLARE @lastid INTEGER = (SELECT MAX([Id]) FROM [ADVWKS].[dbo].[Account]);

为什么我们不能做下面的一个?

DECLARE @lastaccid INTEGER = (EXEC sp_GetGlobalVarVal 'LAST_ACCID');

到目前为止,您只需要一条语句来声明变量,一条语句就可以执行该过程,并将变量分配为return,output,cursor等。我们可以在一条语句中完成它吗?

3 个答案:

答案 0 :(得分:1)

您不能执行以下操作,因为存储过程的返回类型通常是表。它要么执行,然后运行将不返回任何内容的DML语句,要么将返回数据集。现在,您可以做的是建立一个标量值函数而不是存储过程,然后从中选择。 https://docs.microsoft.com/en-us/sql/t-sql/statements/create-function-transact-sql?view=sql-server-2017

另一种可能性是使用:https://docs.microsoft.com/en-us/sql/relational-databases/stored-procedures/return-data-from-a-stored-procedure?view=sql-server-2017#returning-data-using-a-return-code,但是从概念上讲,这仅用于返回码,而不是真正用于变量赋值或填充不同类型的变量,并且不要忘记,只有介于0-4。

答案 1 :(得分:0)

请改用OUTPUT参数。但是,这非常简化:

CREATE PROC TEST_SP @I int, @O int OUTPUT AS

    SET @O = @I *5;

GO

DECLARE @Var int;
EXEC TEST_SP 1,@Var OUTPUT;
SELECT @Var;

GO
--CLEAN UP
DROP PROC TEST_SP;

答案 2 :(得分:0)

您可以使用OUTPUT参数:

这是一个示例SP,其中第二个变量(@ Param_2)被定义为输出参数

CREATE   PROCEDURE [dbo].[MySP]
(
    @Param_1 int,
    @Param_2 int output
)
AS
BEGIN
    SET NOCOUNT ON;

    SET @Param_2 = 10 * @Param_1;
END

现在您可以像这样调用SP:

DECLARE @Value_1 INT = 42;
DECLARE @RetVal INT = 0;

SELECT @RetVal;
EXEC [dbo].[MySP] @Value_1, @Param_2 = @RetVal OUTPUT;
SELECT @RetVal;

您选择的第一时间@RetVal的值仍为0。执行SP后,@ RetVal将为420(SP内计算为10 * 42):

-----------
0

(1 row affected)


-----------
420

(1 row affected)

TLDR:否:)