【问题标题】:How to use MERGE or Upsert Sql statement如何使用 MERGE 或 Upsert Sql 语句
【发布时间】:2018-10-18 08:18:59
【问题描述】:

我如何在下面的代码中使用MERGE Sql 语句或UPDATE 语句。我有一个名为 MachineName 的 columnName,其他列值发生变化,但 MachineName 没有变化。如果MachineName 列发生更改,我需要在第二行中插入新值。如果不是,我需要更新同一行。我怎样才能做到这一点。这是一个正确的方法吗?请帮忙

MERGE INTO [devLaserViso].[dbo].[Machine] WITH (HOLDLOCK) 
USING [devLaserViso].[dbo].[Machine] 
ON (MachineName = MachineName)
  WHEN MATCHED 
       THEN UPDATE SET MachineName = L1,ProgramName= ancdh.pgm, TotalCount= 10, RightCount=4, 
                       LeftCount= 3,ErrorCode=0,FinishingTime=fsefsefef
  WHEN NOT MATCHED 
       THEN INSERT (MachineName, ProgramName, TotalCount, RightCount, LeftCount, ErrorCode, FinishingTime) 
            VALUES (L02, djiwdn.pgm, 11, 5, 4, 0, dnwdnwoin);

【问题讨论】:

  • 样本数据和期望的结果会很有启发性。您正在执行自联接,逻辑没有意义。

标签: sql sql-server merge sql-update upsert


【解决方案1】:

过去我已经成功“选择”要插入到 MERGE 命令的 USING 部分的值:

MERGE INTO [devLaserViso].[dbo].[Machine] WITH (HOLDLOCK) AS Target
USING (SELECT 'L1' AS MachineName, 'ancdh.pgm' AS ProgramName, 10 AS TotalCount, 
   4 AS RightCount, 3 AS LeftCount, 0 AS ErrorCode, 'fsefsefef' AS FinishingTime) AS Source
ON (Target.MachineName = Source.MachineName)
  WHEN MATCHED 
       THEN UPDATE SET ProgramName= Source.ProgramName, TotalCount= Source.TotalCount, 
          RightCount= Source.RightCount, LeftCount= Source.LeftCount, 
          ErrorCode= Source.ErrorCode, FinishingTime= Source.FinishingTime
  WHEN NOT MATCHED 
       THEN INSERT (MachineName, ProgramName, TotalCount, RightCount, LeftCount, ErrorCode, FinishingTime) 
            VALUES (Source.MachineName, Source.ProgramName, Source.TotalCount, Source.RightCount, 
                   Source.LeftCount, Source.ErrorCode, Source.FinishingTime);

【讨论】:

    【解决方案2】:

    您可以将新的 Machine 数据加载到 Temporary 表中,然后可以使用如下 Merge 语句更新 Machine 表中已有记录的记录,如果 Machine 中不存在则插入新记录表。

    MERGE [devLaserViso].[dbo].[Machine] t WITH (HOLDLOCK) 
    USING [devLaserViso].[dbo].[TempMachine] s
    ON (s.MachineName = t.MachineName)
    WHEN MATCHED THEN 
    UPDATE SET t.MachineName = s.MachineName,t.ProgramName =s.ProgramName
    WHEN NOT MATCHED BY TARGET THEN INSERT (MachineName,ProgramName) VALUES (s.MachineName, s.ProgramName);
    

    【讨论】:

    • 这意味着我必须创建一个名为 TempMachine 的表。 ?
    • 是的,创建 TempMachine 并在此表中加载新数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 2012-11-23
    • 1970-01-01
    • 2020-10-13
    • 2021-10-09
    • 1970-01-01
    相关资源
    最近更新 更多