合并更新查询无法正常执行的问题

Roc*_*nce 7 sql sql-server version-control merge sql-update

我试图在SQL Server中执行合并更新查询.

表"my_table"有4列"字段"(字符),"日期"(日期),"val"(数字),"修订版"(日期时间)

查询是这样的:

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.*; 
Run Code Online (Sandbox Code Playgroud)

由于field_"field_example"和date ='2017-01-04'在"my_table"中已经有一行,我希望此查询更新另外两列"val","revision".

我得到以下查询输出:

$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
Run Code Online (Sandbox Code Playgroud)

所以它看起来不错(要更新它应该)

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

知道为什么吗?

Dan*_*man 7

但是当我查看数据库时,该行还没有更新(= 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;
Run Code Online (Sandbox Code Playgroud)

  • @AndreasVenieris,我关于回滚的说明仅在"MERGE"语句和后续回滚之前存在显式事务时才适用.在这种情况下,仍然会返回`OUTPUT`子句的(正确)结果. (4认同)