【问题标题】:SQL UPDATE using unusual syntax使用异常语法的 SQL UPDATE
【发布时间】: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


【解决方案1】:

那一行同时做两件事:

  • 更新PromotionEventDetails.RedeemedAmount
  • @RedeemedAmount变量中存储相同的值

这似乎是常见的UPDATE ... SET column = expression 与 SQL Server 的“设置变量”语法SET @variable = expression 的混合。测试表明不可能做到@a = @b = col1col1 = col2 = col3,它只适用于一个变量和一个目标列。

【讨论】:

  • 至于这两行,我猜他们只是在设置变量,不是吗? @PromotionCodeAmount = PE.PromoCodeAmount, @EventDetailId = PED.Id
猜你喜欢
  • 2013-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多