sql - 合并更新查询未按预期执行的问题

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

我正在尝试在 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="field_example"和 date='2017-01-04',我希望此查询更新另外 2 个列“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

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

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

知道为什么吗?

最佳答案

However when I look in the database, the row has not been updated (= val is still 161250 instead of 0, and revision is still 2017-01-03 10:09:25)

Any idea why?



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

关于sql - 合并更新查询未按预期执行的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41436296/

相关文章:

sql-server - 如何在SQL Server 2008中创建 "No Duplicates"列?

c# - LINQ to SQL - 数据库设计问题

c# - 将构建日期放在关于框中

java - (.Net + SQL Server +Azure ) 与 (Java + Oracle +Google App Engine) 哪个更适合这个项目?

java - 如何一起执行2个查询?

sql - TSQL - 带条件的时间列总和

SQL Server : What is the difference between Index Rebuilding and Index Reorganizing?

ruby - ruby 的颠覆客户端?

git - Visual Studio 数据库项目 *.refactorlog 文件是否属于源代码管理?

mysql - 在函数或PROCEDURE中创建SQL查询