将调用的变量存储在select sql server中



如何在select中存储调用的变量示例:

DECLARE @Qty INT, @workdays INT, @dailygoal INT, @bufferstock INT;
SELECT 
@Qty = SUM(qty) [qty],
@workdays = 25 [workdays],
@dailygoal = (SUM(qty) / 25) [dailygoal],
@bufferstock = (@dailygoal * MAX(leadtime)) [bufferstock]
FROM table

删除别名

DECLARE @Qty INT, @workdays INT, @dailygoal INT, @bufferstock INT;
SELECT 
@Qty = SUM(Bonus_amount),
@workdays = 25,
@dailygoal = (SUM(Bonus_amount) / 25),
@bufferstock = (@dailygoal * 5) 
FROM [dbo].[Bonus]
select @Qty,@workdays,@dailygoal,@bufferstock

由于您的别名,您的查询将出错。当SELECT中分配变量时,不会对列进行别名。

此外,尽管你可以像现在这样使用语法,引用语句中其他地方指定的变量,但我会犯错误;虽然没有记录在案,但如果使用递归变量赋值的反模式与反模式中记录的反模式相同,并且后一个变量可以在前一个变量之前派生,我不会感到惊讶。这意味着变量@bufferstock可以被分配值NULL,因为当确定表达式时,@dailygoal的值是NULL

相反,只需重复以下表达式:

DECLARE @V1 int,
@V2 int;
SELECT @V1 = SUM(V.I),
@V2 = SUM(V.I) * MAX(V.I)
FROM (VALUES(1),(2),(3))V(I);
SELECT @V1,
@V2;

如果您不想这样做,那么使用派生表(CTE或Subquery(来定义表达式。我在这里使用CTE:

DECLARE @V1 int,
@V2 int;
WITH CTE AS(
SELECT SUM(V.I) AS S,
MAX(V.I) AS M
FROM (VALUES(1),(2),(3))V(I))
SELECT @V1 = S,
@V2 = S*M
FROM CTE;
SELECT @V1,
@V2;

使用派生表进行查询的意思如下:

DECLARE @Qty int,
@workdays int,
@dailygoal int,
@bufferstock int;
WITH CTE AS(
SELECT SUM(qty) AS qty,
SUM(qty) / 25 AS dailygoal,
MAX(leadtime) AS leadtime
FROM dbo.[table])
SELECT @Qty = qty,
@workdays = 25,
@dailygoal = dailygoal,
@bufferstock = dailygoal * leadtime
FROM CTE;

最新更新