2017-01-03 21 views
7

Tôi đang cố thực hiện truy vấn cập nhật hợp nhất trong máy chủ sql.vấn đề với truy vấn cập nhật hợp nhất không thực hiện vì nó nên

Bảng "my_table" có 4 cột "lĩnh vực" (nhân vật), "date" (date), "val" (số), "sửa đổi" (datetime)

Truy vấn là như vậy:

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.*; 

Vì đã có hàng trong "my_table" với field = "field_example" và date = '2017-01-04', tôi mong truy vấn này cập nhật 2 cột khác "val", "sửa đổi ".

tôi nhận được đầu ra truy vấn sau đây:

$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 

Vì vậy, nó có vẻ tốt (đã được cập nhật thường là có)

Tuy nhiên khi tôi nhìn vào cơ sở dữ liệu, hàng chưa được cập nhật (= val vẫn là 161250 thay vì 0 và bản chỉnh sửa vẫn là 2017-01-03 10:09:25)

Bất kỳ ý tưởng nào tại sao?

+0

Bạn có thể thêm dữ liệu mẫu của bảng không. –

+0

Hy vọng không có ROLLBACK hoặc lệnh return/revert tồn tại trên đó. –

Trả lời

7

Tuy nhiên khi tôi nhìn vào cơ sở dữ liệu, hàng chưa được cập nhật (= val vẫn là 161.250 thay vì 0, và sửa đổi vẫn là 2017-01-03 10:09:25)

Bất kỳ ý tưởng nào tại sao?

Có thể bạn đang truy vấn một bảng/cơ sở dữ liệu khác hoặc giao dịch đã được khôi phục. Kịch bản dưới đây hoạt động như mong đợi, đoán ở các kiểu dữ liệu thực tế.

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; 
+1

Tôi cho rằng lệnh MERGE không thể quay lại và đầu ra vẫn là những gì nó nhận được. Vì vậy, tôi tin rằng giả định rằng người dùng truy vấn một db/bảng sai nó có nhiều khả năng là đúng sự thật. PS: Và vâng, Merge đã làm việc như mong đợi. –

+4

@AndreasVenieris, lưu ý của tôi về việc khôi phục sẽ chỉ áp dụng nếu có giao dịch rõ ràng trước câu lệnh 'MERGE' và một lần khôi phục tiếp theo. Kết quả (chính xác) của mệnh đề 'OUTPUT' sẽ vẫn được trả lại trong trường hợp đó. –

+0

Xin lỗi @Dan Guzman, tôi chỉ nhận được bạn. Vâng, có thể. Tôi nghĩ bạn có nghĩa là bản thân 'MERGE'. Xin lỗi vì sự hiểu lầm. Mea culpa;) –

Các vấn đề liên quan