
Capturing rowcounts when using Composable DML
By:
jamiet on
Feb 7th, 2013 | syntax:
T-SQL | size: 2.21 KB | hits: 40 | expires: Never
/******************************************************************************************************************************
A solution to the problem outlined at http://pastebin.com/5wBsTVx9, that rowcoutns cannot be captured when using Composable DML
Jamie Thomson, 2013-02-07
******************************************************************************************************************************/
/*Setup table first and insert some data into [src]*/
USE tempdb
IF OBJECT_ID('src') IS NOT NULL DROP TABLE src;
CREATE TABLE src (
id INT
, name NVARCHAR(MAX)
);
IF OBJECT_ID('tgt') IS NOT NULL DROP TABLE tgt;
CREATE TABLE tgt (
id INT
, name NVARCHAR(MAX)
);
/*[updates] will be used as the target of the Composable DML insertion*/
IF OBJECT_ID('old_values') IS NOT NULL DROP TABLE old_values;
CREATE TABLE old_values (
id INT
, name NVARCHAR(MAX)
);
IF OBJECT_ID('mrgout') IS NOT NULL DROP TABLE mrgout;
CREATE TABLE mrgout (
action_ NVARCHAR(MAX)
, inserted_id INT
, inserted_name NVARCHAR(MAX)
, deleted_id INT
, deleted_name NVARCHAR(MAX)
);
INSERT src(id,name)VALUES(1,'don'),(2,'kaina');
GO
/*Everything after here gets run twice because the batch ends with GO 2*/
TRUNCATE TABLE mrgout;
INSERT mrgout(action_, inserted_id, inserted_name,deleted_id, deleted_name )
SELECT mrgout.action_
, mrgout.inserted_id
, mrgout.inserted_name
, mrgout.deleted_id
, mrgout.deleted_name
FROM (
MERGE tgt
USING src
ON tgt.id = src.id
WHEN MATCHED THEN
UPDATE
SET tgt.NAME = src.NAME
WHEN NOT MATCHED THEN
INSERT(id,name)
VALUES(src.id,src.name)
OUTPUT $ACTION AS action_
, INSERTED.id AS inserted_id
, INSERTED.NAME AS inserted_name
, DELETED.id AS deleted_id
, DELETED.name AS deleted_name
)mrgout
;
INSERT dbo.old_values(id,name)
SELECT deleted_id,deleted_name FROM mrgout
WHERE mrgout.action_ = 'UPDATE' --Filtering on $action=UPDATE allows us to get the replaced values from DELETED virtual table
SELECT [INSERT_@@ROWCOUNT]=(SELECT COUNT(*) FROM mrgout WHERE action_ = 'INSERT'),[UPDATE_@@ROWCOUNT]=(SELECT COUNT(*) FROM mrgout WHERE action_ = 'UPDATE'),row_tally_in_tgt=(SELECT COUNT(*) FROM tgt)
GO 2