【发布时间】:2018-11-13 09:07:44
【问题描述】:
我今天遇到了这个存储过程,我对它的语法感到困惑。它正在执行 UPDATE,查询如下所示:
DECLARE @TransactionStatus tinyint = 1,
@RedeemedAmount decimal(18,2) = 0,
@PromotionCodeAmount decimal(18,2) = 0,
@EventDetailId int = 0
UPDATE PED
SET @RedeemedAmount = PED.RedeemedAmount = PED.RedeemedAmount + PE.PromoCodeAmount,
@PromotionCodeAmount = PE.PromoCodeAmount,
@EventDetailId = PED.Id
FROM dbo.PromotionEvents AS PE
JOIN dbo.PromotionEventDetails AS PED ON PED.EventId = PE.Id
WHERE PED.Id IN (
SELECT TOP 1 PED.ID
FROM dbo.PromotionEvents AS PE
JOIN dbo.PromotionEventDetails AS PED ON PED.EventId = PE.Id
WHERE PE.Id = @EventId
AND PED.Amount >= PED.RedeemedAmount + PE.PromoCodeAmount
AND PE.StartDate <= GETDATE() AND PE.EndDate > GETDATE()
AND PE.MStatusId = 1
AND PED.MStatusId = 1
ORDER BY PED.CreatedDateTime)
这只是整个存储过程的一部分。我只需要了解这部分是做什么的?
SET @RedeemedAmount = PED.RedeemedAmount = PED.RedeemedAmount + PE.PromoCodeAmount,
请注意,该行上有两个等号。
【问题讨论】:
-
这只是一些代数,将三个小数相加并将结果存储到另一个小数中。
-
@TimBiegeleisen 您是否注意到小数点之间有
=而不是+,即行上有两个=符号而不是两个+符号? -
嘿@TimBiegeleisen。感谢您的及时回复。我也有同样的想法,但是当我用谷歌搜索时,我找不到任何关于这个的参考。你碰巧有一个吗?
-
@JiriTousek 我错过了。我从未在 SQL 中见过这种情况。在 Java 中,是的,但在 SQL 中不是。
-
这项技术至少可以说有点奇怪,并且有非常重要的注意事项才能正常工作。它被称为“古怪的更新”。 Jeff Moden 在这里有一篇关于这个主题的精彩文章,以及如何使用它来计算总计。 sqlservercentral.com/articles/T-SQL/68467
标签: sql-server sql-server-2008 tsql sql-update