【问题标题】:issue with merge update query not performing as it should合并更新查询未按预期执行的问题
【发布时间】:2017-05-17 02:51:57
【问题描述】:

我正在尝试在 sql server 中执行合并更新查询。

表“my_table”有4列“field”(字符)、“date”(日期)、“val”(数字)、“revision”(日期时间)

查询是这样的:

MERGE "my_table" AS Target USING ( VALUES ('field_example','2017-01-04','0','2017-01-03 12:02:02')) AS Source ("field","date","val","revision")
                   ON (Target."field" = Source."field" AND Target."date" = Source."date")
                   WHEN MATCHED 
                   THEN UPDATE SET Target."val" = Source."val",Target."revision" = Source."revision"
                   WHEN NOT MATCHED BY TARGET 
                   THEN INSERT ("field","date","val","revision")
                   VALUES (Source."field", Source."date", Source."val", Source."revision")
                   OUTPUT $action, Inserted.*, Deleted.*; 

由于“my_table”中已经有一行字段="field_example" 和 date='2017-01-04',我希望这个查询能够更新其他 2 列 "val","re​​vision"。

我得到以下查询输出:

$action            field       date            revision val          field.1     date.1          revision.1  val.1
1  UPDATE field_example 2017-01-04 2017-01-03 12:02:02   0 field_example 2017-01-04 2017-01-03 10:09:25 161250

所以看起来不错(应该已经更新了)

但是当我查看数据库时,该行并没有更新(= val 仍然是 161250 而不是 0,revision 仍然是 2017-01-03 10:09:25)

知道为什么吗?

【问题讨论】:

  • 你能添加你的表的示例数据吗?
  • 希望那里没有 ROLLBACK 或 revert 语句/触发器。

标签: sql sql-server version-control merge sql-update


【解决方案1】:

但是,当我查看数据库时,该行尚未更新(= val 仍然是 161250 而不是 0,修订版仍然是 2017-01-03 10:09:25)

知道为什么吗?

也许您正在查询不同的表/数据库或事务已回滚。下面的脚本按预期工作,猜测实际数据类型。

CREATE TABLE dbo.my_table(
     "field" varchar(100)
     ,"date" date
     ,"val" int
     ,"revision" datetime
     );

INSERT INTO my_table ("field","date","val","revision")
    VALUES ('field_example','2017-01-04','161250','2017-01-03 10:09:25');

MERGE "my_table" AS Target USING ( VALUES ('field_example','2017-01-04','0','2017-01-03 12:02:02')) AS Source ("field","date","val","revision")
    ON (Target."field" = Source."field" AND Target."date" = Source."date")
    WHEN MATCHED THEN
        UPDATE SET Target."val" = Source."val",Target."revision" = Source."revision"
    WHEN NOT MATCHED BY TARGET THEN
        INSERT ("field","date","val","revision")
            VALUES (Source."field", Source."date", Source."val", Source."revision")
    OUTPUT $action, Inserted.*, Deleted.*; 

SELECT "field","date","val","revision" 
FROM my_table;

【讨论】:

  • 我认为 MERGE 命令不可能回滚并且输出仍然是它所得到的。因此,我相信用户查询错误的数据库/表的假设更有可能是正确的。 PS:是的,合并按预期工作。
  • @AndreasVenieris,我关于回滚的注释只有在 MERGE 语句和后续回滚之前存在显式事务时才适用。在这种情况下仍会返回 OUTPUT 子句的(正确)结果。
  • 对不起@Dan Guzman,我明白了。对的,这是可能的。我以为你的意思是“合并”本身。很抱歉对于这个误会。过失;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-09
  • 1970-01-01
相关资源
最近更新 更多