2009-08-12 20 views
26

Tôi tự hỏi những gì y'alls sẽ giới thiệu như là cách tốt nhất để đi về nhận được hành động đếm từ một tuyên bố MERGE trong Sql Server. Vì vậy, tức là tôi chạy một MERGE mà một số chèn, một số cập nhật và một số xóa, ... Tôi muốn có thể tìm hiểu CÁCH NHIỀU chèn, CÁCH NHIỀU cập nhật và bao nhiêu xóa.Sql Server 2008 MERGE - cách tốt nhất để có được số lượng

Cách tốt nhất để làm điều này là gì?

Trả lời

31

Bạn có thể chỉ định mệnh đề OUTPUT trên báo cáo MERGE và nhận báo cáo đầu ra về những gì đã được thực hiện trong quá trình MERGE.

MERGE (targetTable) AS t 
USING (sourceTable) AS s 
ON t.ID = s.ID 
WHEN MATCHED THEN 
    (some statements) 
WHEN NOT MATCHED THEN 
    (some statements) 
OUTPUT 
    $action, inserted.ID 'inserted', deleted.ID 'deleted' 
; 

Điều này sẽ cho bạn một hàng cho mỗi "hành động" (chèn, cập nhật, xóa) cho mỗi thao tác. Nếu có nhiều câu lệnh, bạn cũng có thể OUTPUT INTO @tableVar và sau đó nhìn vào biến bảng.

DECLARE @tableVar TABLE (MergeAction VARCHAR(20), InsertedID INT, DeletedID INT) 

MERGE (targetTable) AS t 
USING (sourceTable) AS s 
ON t.ID = s.ID 
WHEN MATCHED THEN 
     (some statements) 
WHEN NOT MATCHED THEN 
     (some statements) 
OUTPUT 
     $action, inserted.ID 'inserted', deleted.ID 'deleted' INTO @tableVar 
; 

SELECT MergeAction, COUNT(*) 
FROM @tableVar 
GROUP BY MergeAction 

Check-out Sách Online để biết chi tiết về các MERGE tuyên bố và OUTPUT clause.

Marc

+0

Có thể bằng cách nào đó để làm điều này trong một tuyên bố, có thể với một nhóm không? sao cho bit đầu ra sẽ là thứ gì đó dọc theo dòng> OUTPUT $ ACTION, COUNT (1) GROUP BY $ ACTION? – eidylon

+0

Không, bạn không thể làm điều này. Bạn có thể hoặc chỉ là OUTPUT đến cửa sổ đầu ra SSMS, hoặc vào một biến bảng - không quá căng ra mệnh đề OUTPUT !! :-) –

+0

Ah well ... Trên thực tế, OUTPUT có đưa ra một biến bảng hay một resultset không? Có thể bọc câu lệnh MERGE với mệnh đề OUTPUT bên trong câu lệnh SELECT làm nguồn (như truy vấn con) và sau đó có lệnh SELECT bên ngoài làm tổng hợp không? ... Nghe có thể. Tôi có thể phải chơi với điều đó. – eidylon

1

Làm thế nào về:

INSERT YourResultsTable (action, cnt) 
SELECT action, count(*) 
FROM 
(
    MERGE (targetTable) AS t 
    USING (sourceTable) AS s 
     ON t.ID = s.ID 
    WHEN MATCHED THEN  (some statements) 
    WHEN NOT MATCHED THEN  (some statements) 
    OUTPUT $action as action, inserted.ID as ins, deleted.ID as del 
) m 
GROUP BY action; 

[Chỉnh sửa] Ok, vì vậy hãy thử:

INSERT YourResultsTable (action) 
SELECT action 
FROM 
(
    MERGE (targetTable) AS t 
    USING (sourceTable) AS s 
     ON t.ID = s.ID 
    WHEN MATCHED THEN  (some statements) 
    WHEN NOT MATCHED THEN  (some statements) 
    OUTPUT $action as action, inserted.ID as ins, deleted.ID as del 
) m; 

(và sau đó đếm kết quả)

Rob

+0

Không: Msg 10717, Cấp 15, Tiểu bang 1, Dòng 48 Điều khoản GROUP BY không được phép khi mệnh đề FROM chứa INSERT lồng nhau , Báo cáo UPDATE, DELETE hoặc MERGE. –

+0

Thử nghiệm trên SQL Server 2008 Phiên bản dành cho nhà phát triển –

+0

Tôi đã sử dụng bản chỉnh sửa của bạn, sau đó lấy bảng mà bạn chèn vào và tổng hợp các hành động riêng lẻ thành SUM-Tổng số bằng cách sử dụng Case-Statements và ghi lại các kết quả đó. Nó hoạt động tuyệt vời! Nó stinks rằng SQL Server buộc tôi để chèn các kết quả hợp nhất vào một biến bảng thay vì tổng hợp và thiết lập int-biến của tôi trực tiếp trong ngoài cùng chọn. – MikeTeeVee

4

Để trích xuất vào indiv vars idual, có thể đăng bài quá trình câu trả lời bằng cách sử dụng marc_s trục:

declare 
     @mergeResultsTable table (MergeAction VARCHAR(20)); 

    declare 
     @insertCount int, 
     @updateCount int, 
     @deleteCount int; 

    merge ... 
    output $action into @mergeResultsTable; 

    select @insertCount = [INSERT], 
      @updateCount = [UPDATE], 
      @deleteCount = [DELETE] 
     from (select 'NOOP' MergeAction -- row for null merge into null 
      union all 
      select * from @mergeResultsTable) mergeResultsPlusEmptyRow  
    pivot (count(MergeAction) 
     for MergeAction in ([INSERT],[UPDATE],[DELETE])) 
     as mergeResultsPivot; 

Các công đoàn 'noop' hàng có thể được gỡ bỏ nếu init vars 0 hoặc biết rằng nguồn hoặc đích bảng có> 0 hàng.