【问题标题】:Multiple Steps on WHEN NOT MATCHED possible?WHEN NOT MATCHED 可能的多个步骤?
【发布时间】:2013-06-28 17:34:19
【问题描述】:

如果未找到更新匹配项,我需要使用一个序列来重新计算主键中的两个字段。是否仍然可以在这里使用 MERGE 语句?我试过 WHEN MATCHED THEN BEGIN,但 BEGIN 在这里无效。

具体来说,我有一对构成主键的数字。第一个是分组,第二个是组内的一系列项目。如果出现问题,该组以 99990 的形式出现,我需要将它与序列组合并使用序列来递增,然后将其拆分回来。因此,当组以 99990 进入时,我计算的组的范围可以从 99990 到 99999,那么序列号的范围将是从 00 到 99。

我想不出一种方法可以将其作为 INSERT 分配的一部分,而且我不知道如何让 MERGE 执行多个步骤,所以我猜我又回到了 UPDATE,如果@@ROWCOUNT = 0 开始。有人有更快的方法吗?

【问题讨论】:

  • 您使用的是哪个 DBMS?从@@rowcount 判断可能是 SQL Server?
  • 正如您所猜测的,它是 SQL Server。

标签: sql sql-server merge


【解决方案1】:

这行得通,

  1. 声明一个名为@isinsert 的标志变量(位)
  2. 将其初始化为 1。
  3. 在更新子句中将其设置为 0。

像这样:(假设一个名为 table1 的表带有一个数字 'id' 字段和一个 nvarchar 'field1' 字段)。

declare @id numeric(18,0)                  -- That's the he lookup key 
set @id=999                                -- We use id as the search key
                                           -- You can use any other field    
declare @field nvarchar(50)
set @field = 'insert or update value(s)'   -- This is the new value

declare @isinsert bit                      -- This is a flag that will
set @isinsert=1                            -- indicate whether an insert or 
                                           -- an update were performed 

MERGE table1 AS target
    USING (SELECT @field) AS source (field1)
    ON (target.id = @id)
    WHEN MATCHED THEN 
        UPDATE SET field1 = source.field1
        ,@isinsert = 0                     -- Set @isinsert to 0 on updates
    WHEN NOT MATCHED THEN   
        INSERT (field1)
        VALUES (source.field1);

if (@isinsert=1) print concat('inserted record at id: ',@@IDENTITY)
else print concat('updated record at id: ',@id)

【讨论】:

  • Kewl。我还没有时间去了解这个,但它看起来很有趣。我怀疑我会学到一些新东西。本着这种精神,我对此表示赞成。使用它为时已晚,但学习新东西永远不会太晚。谢谢。
【解决方案2】:

很遗憾,不能在 MERGE 中执行多个步骤。有时可以使用新的公用表表达式语法,但我使用了 UPDATE, IF @@ROWcOUNT = 0, INSERT 以便我可以在插入时执行多个步骤。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-15
    • 2016-05-10
    • 2018-02-18
    • 1970-01-01
    • 2017-02-13
    • 1970-01-01
    • 2017-01-24
    相关资源
    最近更新 更多