是否可以在一个语句中声明和分配sp的结果? 如果可以,
DECLARE @lastid INTEGER = (SELECT MAX([Id]) FROM [ADVWKS].[dbo].[Account]);
为什么我们不能做下面的一个?
DECLARE @lastaccid INTEGER = (EXEC sp_GetGlobalVarVal 'LAST_ACCID');
到目前为止,您只需要一条语句来声明变量,一条语句就可以执行该过程,并将变量分配为return,output,cursor等。我们可以在一条语句中完成它吗?
答案 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:否:)