2013-05-30 41 views
13

Nếu tôi có nhiều câu lệnh WHEN MATCHED trong câu lệnh MERGE, chúng có thực thi nếu chúng đúng không?Khi sử dụng nhiều câu lệnh WHEN MATCHED, tất cả các câu lệnh đó có thực thi hay chỉ một lệnh được thực thi?

dụ của tôi:

DECLARE @X bit = NULL; 

--skipping the MERGE statement, straight to WHEN MATCHED 

WHEN MATCHED AND A = 1 
    @X = 0; 
WHEN MATCHED AND B = 1 
    @X = 1; 

trạng thái của X trong mỗi 4 khả năng là gì?

A|B|X 
0|0|? 
0|1|? 
1|0|? 
1|1|? 

Về cơ bản, tôi tò mò nếu có ngầm định BREAK sau mỗi mệnh đề WHCH MATCHED.

Trả lời

10

Để trả lời câu hỏi của bạn, có, nó sẽ chỉ chạy một trận đấu duy nhất và sau đó ngắt. Tuy nhiên, nếu bạn muốn có logic để cho phép kết hợp điều kiện trong bản cập nhật, câu lệnh CASE khá hữu ích cho việc này.

Something như thế này là một ví dụ:

MERGE INTO YourTable 
USING (VALUES (1, 1, NULL), (0, 0, NULL), (0, 1, NULL), (1, 0, NULL)) 
     T2 (a2,b2,c2) 
ON a = a2 AND b = b2 
WHEN MATCHED THEN 
    UPDATE SET c = 
     CASE 
     WHEN a = 1 THEN 0 
     WHEN b = 1 THEN 1 
     ELSE NULL 
     END   
WHEN NOT MATCHED THEN 
    INSERT (a, b) VALUES (a2, b2); 

SELECT * FROM YourTable ORDER BY a,b; 

Và kết quả:

A B C 
-------------- 
0 0 (null) 
0 1 1 
1 0 0 
1 1 0 
+1

Chưa bao giờ nghe nói về SQLFiddle, đó là chết tiệt hữu ích. Cảm ơn câu trả lời toàn diện. Vấn đề của tôi đã kết thúc ở những nơi khác trong sproc, nhưng điều này trả lời câu hỏi ban đầu của tôi, vì vậy tôi sẽ đánh dấu nó. Cảm ơn! – Codeman

+1

@ Pheonixblade9 - np, và tôi đồng ý, Fiddle thật tuyệt vời. Trân trọng. – sgeddes

16

tôi tìm thấy trong MSDN documentation:

khi xuất hiện THEN

Chỉ định rằng tất cả các hàng của target_table phù hợp với các hàng trả về bởi ON, và đáp ứng bất kỳ điều kiện tìm kiếm bổ sung, hoặc là cập nhật hoặc xóa theo cho mệnh đề.

Câu lệnh MERGE có thể có tối đa hai mệnh đề WHCH MATCHED. Nếu hai mệnh đề được xác định, thì mệnh đề đầu tiên phải được kèm theo một mệnh đề AND. Đối với bất kỳ hàng cụ thể nào, mệnh đề WHEN MATCHED thứ hai chỉ được áp dụng nếu mệnh đề đầu tiên không được áp dụng. Nếu có hai mệnh đề WHEN MATCHED, thì người ta phải chỉ định một hành động UPDATE và người ta phải chỉ định một hành động DELETE. Nếu UPDATE được xác định trong mệnh đề, và nhiều hơn một hàng khớp với một hàng trong target_table dựa trên, SQL Server trả về một lỗi. Câu lệnh MERGE không thể cập nhật cùng một hàng nhiều lần, hoặc cập nhật và xóa cùng một hàng.

Vì vậy, có vẻ như chỉ có một trong các câu lệnh được thực hiện và chúng yêu cầu DELETE trong một và UPDATE ở bên kia.

0

cũng câu trả lời là, bạn có thực sự muốn để beca sử dụng nếu bạn làm bạn sẽ thay đổi một tập hợp cập nhật dựa trên một hàng bằng cách agonizing cập nhật hàng chậm như trong một tập hợp các hàng bạn thực sự sẽ không biết những gì cột thay đổi trên một bản ghi bởi cơ sở ghi lại.

do đó, bạn có muốn nhận được hiệu suất không? nếu như vậy, chắc chắn rằng bạn có chỉ số đó bao gồm các

khi xuất hiện TARGET.FIELD1 = NGUỒN: field1 VÀ TARGET.FIELD2 = NGUỒN: field2 ...

nếu không bạn sẽ phải con trỏ trên của bạn cập nhật sau khi hợp nhất bằng cách sử dụng trình kích hoạt INSTEAD OF ...

Không tốt cho tốc độ, tuy nhiên có thể có tác dụng nếu bạn cần phải ghi lại những người đã làm những gì ...

Chúc mừng Mã hóa

Walter

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