<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://sqlblog.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>SSIS Junkie : merge</title><link>http://sqlblog.com/blogs/jamie_thomson/archive/tags/merge/default.aspx</link><description>Tags: merge</description><dc:language>en</dc:language><generator>CommunityServer 2.1 SP2 (Build: 61129.1)</generator><item><title>Obtaining rowcounts when using Composable DML [T-SQL]</title><link>http://sqlblog.com/blogs/jamie_thomson/archive/2013/02/07/obtaining-rowcounts-when-using-composable-dml.aspx</link><pubDate>Thu, 07 Feb 2013 13:59:57 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:47531</guid><dc:creator>jamiet</dc:creator><slash:comments>6</slash:comments><comments>http://sqlblog.com/blogs/jamie_thomson/comments/47531.aspx</comments><wfw:commentRss>http://sqlblog.com/blogs/jamie_thomson/commentrss.aspx?PostID=47531</wfw:commentRss><wfw:comment>http://sqlblog.com/blogs/jamie_thomson/rsscomments.aspx?PostID=47531</wfw:comment><description>&lt;p&gt;In my August 2009 blog post &lt;a href="http://sqlblog.com/blogs/jamie_thomson/archive/2009/08/31/exploring-composable-dml.aspx" target="_blank"&gt;Exploring Composable DML&lt;/a&gt; I introduced a new feature in SQL Server 2008 called Composable DML and also outlined one of its limitations; namely that data from the OUTPUT cannot be aggregated prior to insertion. Composable DML does have some useful scenarios however and one of those is in capturing and storing values that are replaced by an UPDATE (which I have talked about before in &lt;a title="http://sqlblog.com/blogs/jamie_thomson/archive/2012/07/13/using-composable-dml-to-maintain-entity-history-t-sql.aspx" href="http://sqlblog.com/blogs/jamie_thomson/archive/2012/07/13/using-composable-dml-to-maintain-entity-history-t-sql.aspx" target="_blank"&gt;Using Composable DML to maintain entity history&lt;/a&gt;). Here’s the basic premise:&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre style="text-align:left;list-style-type:disc;font-family:;background:white;color:;"&gt;&lt;font face="Consolas"&gt;&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size:9.8pt;"&gt;INSERT&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size:9.8pt;"&gt; old_values&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;(&lt;/font&gt;&lt;/span&gt; id&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;,&lt;/font&gt;&lt;/span&gt; name &lt;span style="color:;"&gt;&lt;font color="#808080"&gt;)&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#008000"&gt;--use Composable DML to store the values that were replaced by an UPDATE&lt;/font&gt;&lt;/span&gt;
&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;SELECT&lt;/font&gt;&lt;/span&gt;	mrgout&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;.&lt;/font&gt;&lt;/span&gt;deleted_id
&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;,&lt;/font&gt;&lt;/span&gt;		mrgout&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;.&lt;/font&gt;&lt;/span&gt;deleted_name
&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;FROM	&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;(&lt;/font&gt;&lt;/span&gt;
		&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;MERGE&lt;/font&gt;&lt;/span&gt;	tgt
		&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;USING&lt;/font&gt;&lt;/span&gt;	src
			&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;ON&lt;/font&gt;&lt;/span&gt;	tgt&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;.&lt;/font&gt;&lt;/span&gt;id &lt;span style="color:;"&gt;&lt;font color="#808080"&gt;=&lt;/font&gt;&lt;/span&gt; src&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;.&lt;/font&gt;&lt;/span&gt;id
		&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;WHEN&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;MATCHED&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;THEN&lt;/font&gt;&lt;/span&gt;&amp;#160; &lt;span style="color:;"&gt;&lt;font color="#ff00ff"&gt;UPDATE&lt;/font&gt;&lt;/span&gt;	
			&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;SET&lt;/font&gt;&lt;/span&gt;	tgt&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;.&lt;/font&gt;&lt;/span&gt;NAME &lt;span style="color:;"&gt;&lt;font color="#808080"&gt;=&lt;/font&gt;&lt;/span&gt; src&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;.&lt;/font&gt;&lt;/span&gt;NAME&amp;#160;&amp;#160; &lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;WHEN&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;NOT&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;MATCHED&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;THEN&lt;/font&gt;&lt;/span&gt;&amp;#160;&amp;#160; &lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;INSERT&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;(&lt;/font&gt;&lt;/span&gt;id&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;,&lt;/font&gt;&lt;/span&gt;name&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;)&lt;/font&gt;&lt;/span&gt;
			&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;VALUES&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;(&lt;/font&gt;&lt;/span&gt;src&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;.&lt;/font&gt;&lt;/span&gt;id&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;,&lt;/font&gt;&lt;/span&gt;src&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;.&lt;/font&gt;&lt;/span&gt;name&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;)&lt;/font&gt;&lt;/span&gt;
		&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;OUTPUT&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#ff00ff"&gt;$ACTION&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;AS&lt;/font&gt;&lt;/span&gt; action_
		&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;,&lt;/font&gt;&lt;/span&gt;		INSERTED&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;.&lt;/font&gt;&lt;/span&gt;id &lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;AS&lt;/font&gt;&lt;/span&gt; inserted_id
		&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;,&lt;/font&gt;&lt;/span&gt;		INSERTED&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;.&lt;/font&gt;&lt;/span&gt;NAME &lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;AS&lt;/font&gt;&lt;/span&gt; inserted_name
		&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;,&lt;/font&gt;&lt;/span&gt;		DELETED&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;.&lt;/font&gt;&lt;/span&gt;id &lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;AS&lt;/font&gt;&lt;/span&gt; deleted_id
		&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;,&lt;/font&gt;&lt;/span&gt;		DELETED&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;.&lt;/font&gt;&lt;/span&gt;name &lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;AS&lt;/font&gt;&lt;/span&gt; deleted_name
		&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;)&lt;/font&gt;&lt;/span&gt;mrgout
&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;WHERE&lt;/font&gt;&lt;/span&gt;	mrgout&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;.&lt;/font&gt;&lt;/span&gt;action_ &lt;span style="color:;"&gt;&lt;font color="#808080"&gt;=&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#ff0000"&gt;'UPDATE'&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#008000"&gt;--Filtering on $action=UPDATE allows us to get the replaced values from DELETED virtual table&lt;/font&gt;&lt;/span&gt;
&lt;/font&gt;&lt;span style="color:;"&gt;&lt;font style="font-size:9.8pt;" color="#808080"&gt;;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;This statement updates some rows in [tgt] and stores the old values in [old_values]. I think that’s rather useful, especially in a data warehousing scenario where one may wish to MERGE to a type 1 dimension table. Unfortunately this scenario gives rise to another limitation of Composable DML – the value returned by &lt;font color="#ff00ff"&gt;@@ROWCOUNT&lt;/font&gt; is the number of rows that were affected in [old_values], not in [tgt]. The following code (which you can simply copy/paste and execute and which is also &lt;a href="http://pastebin.com/5wBsTVx9" target="_blank"&gt;available on pastebin&lt;/a&gt;) demonstrates this problem:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre style="text-align:left;list-style-type:disc;font-family:;background:white;color:;"&gt;&lt;font face="Consolas"&gt;&lt;span style="color:;"&gt;&lt;font color="#008000"&gt;&lt;font style="font-size:9.8pt;"&gt;/******************************************************************************************************************************&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size:9.8pt;"&gt;
&lt;span style="color:;"&gt;&lt;font color="#008000"&gt;A demonstration of capturing rowcounts when using composable DML. The problem I'm trying to demonstrate here is that &lt;/font&gt;&lt;/span&gt;
&lt;span style="color:;"&gt;&lt;font color="#008000"&gt;I don't think there is a way to capture the number of rows affected by the MERGE&lt;/font&gt;&lt;/span&gt;
 
&lt;span style="color:;"&gt;&lt;font color="#008000"&gt;Jamie Thomson, 2013-02-07&lt;/font&gt;&lt;/span&gt;
&lt;span style="color:;"&gt;&lt;font color="#008000"&gt;******************************************************************************************************************************/&lt;/font&gt;&lt;/span&gt;
 
&lt;span style="color:;"&gt;&lt;font color="#008000"&gt;/*Setup table first and insert some data into [src]*/&lt;/font&gt;&lt;/span&gt;
&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;USE&lt;/font&gt;&lt;/span&gt; tempdb
&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;IF&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#ff00ff"&gt;OBJECT_ID&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;(&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#ff0000"&gt;'src'&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;)&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;IS&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;NOT&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;NULL&lt;/font&gt;&lt;/span&gt;		&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;DROP&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;TABLE&lt;/font&gt;&lt;/span&gt; src&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;;&lt;/font&gt;&lt;/span&gt;
&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;CREATE&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;TABLE&lt;/font&gt;&lt;/span&gt; src&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;&amp;#160;&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;(&lt;/font&gt;&lt;/span&gt;
	id		&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;INT&lt;/font&gt;&lt;/span&gt;
&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;,&lt;/font&gt;&lt;/span&gt;	name&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;NVARCHAR&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;(&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#ff00ff"&gt;MAX&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;)&lt;/font&gt;&lt;/span&gt;
&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;);&lt;/font&gt;&lt;/span&gt;
&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;IF&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#ff00ff"&gt;OBJECT_ID&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;(&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#ff0000"&gt;'tgt'&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;)&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;IS&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;NOT&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;NULL&lt;/font&gt;&lt;/span&gt;		&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;DROP&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;TABLE&lt;/font&gt;&lt;/span&gt; tgt&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;;&lt;/font&gt;&lt;/span&gt;
&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;CREATE&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;TABLE&lt;/font&gt;&lt;/span&gt; tgt&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;&amp;#160;&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;(&lt;/font&gt;&lt;/span&gt;
	id		&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;INT&lt;/font&gt;&lt;/span&gt;
&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;,&lt;/font&gt;&lt;/span&gt;	name&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;NVARCHAR&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;(&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#ff00ff"&gt;MAX&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;)&lt;/font&gt;&lt;/span&gt;
&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;);&lt;/font&gt;&lt;/span&gt;
&lt;span style="color:;"&gt;&lt;font color="#008000"&gt;/*[updates] will be used as the target of the Composable DML insertion*/&lt;/font&gt;&lt;/span&gt;
&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;IF&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#ff00ff"&gt;OBJECT_ID&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;(&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#ff0000"&gt;'old_values'&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;)&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;IS&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;NOT&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;NULL&lt;/font&gt;&lt;/span&gt;		&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;DROP&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;TABLE&lt;/font&gt;&lt;/span&gt; old_values&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;;&lt;/font&gt;&lt;/span&gt;
&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;CREATE&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;TABLE&lt;/font&gt;&lt;/span&gt; old_values&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;&amp;#160;&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;(&lt;/font&gt;&lt;/span&gt;
	id		&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;INT&lt;/font&gt;&lt;/span&gt;
&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;,&lt;/font&gt;&lt;/span&gt;	name&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;NVARCHAR&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;(&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#ff00ff"&gt;MAX&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;)&lt;/font&gt;&lt;/span&gt;
&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;);&lt;/font&gt;&lt;/span&gt;
&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;INSERT&lt;/font&gt;&lt;/span&gt; src&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;(&lt;/font&gt;&lt;/span&gt;id&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;,&lt;/font&gt;&lt;/span&gt;name&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;)&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;VALUES&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;(&lt;/font&gt;&lt;/span&gt;1&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;,&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#ff0000"&gt;'don'&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;),(&lt;/font&gt;&lt;/span&gt;2&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;,&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#ff0000"&gt;'kaina'&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;);&lt;/font&gt;&lt;/span&gt;
&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;GO&lt;/font&gt;&lt;/span&gt;
 
&lt;span style="color:;"&gt;&lt;font color="#008000"&gt;/*Everything after here gets run twice because the batch ends with GO 2*/&lt;/font&gt;&lt;/span&gt;
&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;INSERT&lt;/font&gt;&lt;/span&gt; old_values&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;(&lt;/font&gt;&lt;/span&gt; id&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;,&lt;/font&gt;&lt;/span&gt; name &lt;span style="color:;"&gt;&lt;font color="#808080"&gt;)&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#008000"&gt;--use Composable DML to store the values that were replaced by an UPDATE&lt;/font&gt;&lt;/span&gt;
&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;SELECT&lt;/font&gt;&lt;/span&gt;	mrgout&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;.&lt;/font&gt;&lt;/span&gt;deleted_id
&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;,&lt;/font&gt;&lt;/span&gt;		mrgout&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;.&lt;/font&gt;&lt;/span&gt;deleted_name
&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;FROM	&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;(&lt;/font&gt;&lt;/span&gt;
		&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;MERGE&lt;/font&gt;&lt;/span&gt;	tgt
		&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;USING&lt;/font&gt;&lt;/span&gt;	src
			&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;ON&lt;/font&gt;&lt;/span&gt;	tgt&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;.&lt;/font&gt;&lt;/span&gt;id &lt;span style="color:;"&gt;&lt;font color="#808080"&gt;=&lt;/font&gt;&lt;/span&gt; src&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;.&lt;/font&gt;&lt;/span&gt;id
		&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;WHEN&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;MATCHED&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;THEN&lt;/font&gt;&lt;/span&gt;&amp;#160; &lt;span style="color:;"&gt;&lt;font color="#ff00ff"&gt;UPDATE&lt;/font&gt;&lt;/span&gt;	
			&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;SET&lt;/font&gt;&lt;/span&gt;	tgt&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;.&lt;/font&gt;&lt;/span&gt;NAME &lt;span style="color:;"&gt;&lt;font color="#808080"&gt;=&lt;/font&gt;&lt;/span&gt; src&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;.&lt;/font&gt;&lt;/span&gt;NAME&amp;#160;&amp;#160; &lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;WHEN&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;NOT&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;MATCHED&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;THEN&lt;/font&gt;&lt;/span&gt;&amp;#160;&amp;#160; &lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;INSERT&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;(&lt;/font&gt;&lt;/span&gt;id&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;,&lt;/font&gt;&lt;/span&gt;name&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;)&lt;/font&gt;&lt;/span&gt;
			&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;VALUES&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;(&lt;/font&gt;&lt;/span&gt;src&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;.&lt;/font&gt;&lt;/span&gt;id&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;,&lt;/font&gt;&lt;/span&gt;src&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;.&lt;/font&gt;&lt;/span&gt;name&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;)&lt;/font&gt;&lt;/span&gt;
		&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;OUTPUT&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#ff00ff"&gt;$ACTION&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;AS&lt;/font&gt;&lt;/span&gt; action_
		&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;,&lt;/font&gt;&lt;/span&gt;		INSERTED&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;.&lt;/font&gt;&lt;/span&gt;id &lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;AS&lt;/font&gt;&lt;/span&gt; inserted_id
		&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;,&lt;/font&gt;&lt;/span&gt;		INSERTED&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;.&lt;/font&gt;&lt;/span&gt;NAME &lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;AS&lt;/font&gt;&lt;/span&gt; inserted_name
		&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;,&lt;/font&gt;&lt;/span&gt;		DELETED&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;.&lt;/font&gt;&lt;/span&gt;id &lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;AS&lt;/font&gt;&lt;/span&gt; deleted_id
		&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;,&lt;/font&gt;&lt;/span&gt;		DELETED&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;.&lt;/font&gt;&lt;/span&gt;name &lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;AS&lt;/font&gt;&lt;/span&gt; deleted_name
		&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;)&lt;/font&gt;&lt;/span&gt;mrgout
&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;WHERE&lt;/font&gt;&lt;/span&gt;	mrgout&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;.&lt;/font&gt;&lt;/span&gt;action_ &lt;span style="color:;"&gt;&lt;font color="#808080"&gt;=&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#ff0000"&gt;'UPDATE'&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#008000"&gt;--Filtering on $action=UPDATE allows us to get the replaced values from DELETED virtual table&lt;/font&gt;&lt;/span&gt;
&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;;&lt;/font&gt;&lt;/span&gt;
&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;SELECT&lt;/font&gt;&lt;/span&gt;	[@@ROWCOUNT]&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;=&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#ff00ff"&gt;@@ROWCOUNT&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;,&lt;/font&gt;&lt;/span&gt;row_tally_in_tgt&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;=(&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;SELECT&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#ff00ff"&gt;COUNT&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;(*)&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;FROM&lt;/font&gt;&lt;/span&gt; tgt&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;)&lt;/font&gt;&lt;/span&gt;&amp;#160; &lt;span style="color:;"&gt;&lt;font color="#008000"&gt;-- &amp;lt;-Rowcount only provides tally of rows affected by the outer INSERT, not the MERGE&lt;/font&gt;&lt;/span&gt;
&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;GO&lt;/font&gt;&lt;/span&gt; 2
&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here is the output:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_7001D9F8.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_1A01D821.png" width="244" height="137" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Notice that the Composable DML containing the MERGE statement is executed twice. The first execution inserts two rows into [tgt] yet &lt;span style="color:;"&gt;&lt;font color="#ff00ff"&gt;@@ROWCOUNT&lt;/font&gt;&lt;/span&gt; returns zero because zero rows were inserted into [old_values] by the outer query. The second execution results in two rows in [tgt] being updated hence two rows are inserted into [old_values] and hence why &lt;span style="color:;"&gt;&lt;font color="#ff00ff"&gt;@@ROWCOUNT&lt;/font&gt;&lt;/span&gt; returns two. It appears there is no way to discover the number of inserts or updates that were committed by the MERGE; if you’re a fan of logging rowcounts during ETL operations (which I think you should be) then this is a big problem. The only way I can think of getting around this problem is to break the statement into two like so (for brevity I haven’t included the full code listing so it is also available &lt;a href="http://pastebin.com/HHSSNV2H" target="_blank"&gt;on pastebin&lt;/a&gt;):&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre style="text-align:left;list-style-type:disc;font-family:;background:white;color:;"&gt;&lt;font face="Consolas"&gt;&lt;span style="color:;"&gt;&lt;font color="#008000"&gt;&lt;font style="font-size:9.8pt;"&gt;/*Setup part is the same as before, we do need an extra table for capturing the output of our MERGE tho*/&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size:9.8pt;"&gt;
&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;IF&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#ff00ff"&gt;OBJECT_ID&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;(&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#ff0000"&gt;'mrgout'&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;)&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;IS&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;NOT&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;NULL&lt;/font&gt;&lt;/span&gt;		&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;DROP&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;TABLE&lt;/font&gt;&lt;/span&gt; mrgout&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;;&lt;/font&gt;&lt;/span&gt;
&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;CREATE&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;TABLE&lt;/font&gt;&lt;/span&gt; mrgout&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;&amp;#160;&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;(&lt;/font&gt;&lt;/span&gt;
	action_			&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;NVARCHAR&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;(&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#ff00ff"&gt;MAX&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;)&lt;/font&gt;&lt;/span&gt;
&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;,&lt;/font&gt;&lt;/span&gt;	inserted_id		&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;INT&lt;/font&gt;&lt;/span&gt;
&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;,&lt;/font&gt;&lt;/span&gt;	inserted_name&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;NVARCHAR&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;(&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#ff00ff"&gt;MAX&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;)&lt;/font&gt;&lt;/span&gt;
&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;,&lt;/font&gt;&lt;/span&gt;	deleted_id		&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;INT&lt;/font&gt;&lt;/span&gt;
&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;,&lt;/font&gt;&lt;/span&gt;	deleted_name&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;NVARCHAR&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;(&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#ff00ff"&gt;MAX&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;)&lt;/font&gt;&lt;/span&gt;
&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;);&lt;/font&gt;&lt;/span&gt;
&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;INSERT&lt;/font&gt;&lt;/span&gt; src&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;(&lt;/font&gt;&lt;/span&gt;id&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;,&lt;/font&gt;&lt;/span&gt;name&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;)&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;VALUES&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;(&lt;/font&gt;&lt;/span&gt;1&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;,&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#ff0000"&gt;'don'&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;),(&lt;/font&gt;&lt;/span&gt;2&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;,&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#ff0000"&gt;'kaina'&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;);&lt;/font&gt;&lt;/span&gt;
&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;GO&lt;/font&gt;&lt;/span&gt;
 
&lt;span style="color:;"&gt;&lt;font color="#008000"&gt;/*Everything after here gets run twice because the batch ends with GO 2*/&lt;/font&gt;&lt;/span&gt;
&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;TRUNCATE&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;TABLE&lt;/font&gt;&lt;/span&gt; mrgout&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;;&lt;/font&gt;&lt;/span&gt;
&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;INSERT&lt;/font&gt;&lt;/span&gt; mrgout&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;(&lt;/font&gt;&lt;/span&gt;action_&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;,&lt;/font&gt;&lt;/span&gt; inserted_id&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;,&lt;/font&gt;&lt;/span&gt; inserted_name&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;,&lt;/font&gt;&lt;/span&gt;deleted_id&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;,&lt;/font&gt;&lt;/span&gt; deleted_name &lt;span style="color:;"&gt;&lt;font color="#808080"&gt;)&lt;/font&gt;&lt;/span&gt;
&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;SELECT&lt;/font&gt;&lt;/span&gt;	mrgout&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;.&lt;/font&gt;&lt;/span&gt;action_
&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;,&lt;/font&gt;&lt;/span&gt;		mrgout&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;.&lt;/font&gt;&lt;/span&gt;inserted_id
&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;,&lt;/font&gt;&lt;/span&gt;		mrgout&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;.&lt;/font&gt;&lt;/span&gt;inserted_name
&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;,&lt;/font&gt;&lt;/span&gt;		mrgout&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;.&lt;/font&gt;&lt;/span&gt;deleted_id
&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;,&lt;/font&gt;&lt;/span&gt;		mrgout&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;.&lt;/font&gt;&lt;/span&gt;deleted_name
&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;FROM	&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;(&lt;/font&gt;&lt;/span&gt;
		&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;MERGE&lt;/font&gt;&lt;/span&gt;	tgt
		&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;USING&lt;/font&gt;&lt;/span&gt;	src
			&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;ON&lt;/font&gt;&lt;/span&gt;	tgt&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;.&lt;/font&gt;&lt;/span&gt;id &lt;span style="color:;"&gt;&lt;font color="#808080"&gt;=&lt;/font&gt;&lt;/span&gt; src&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;.&lt;/font&gt;&lt;/span&gt;id
		&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;WHEN&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;MATCHED&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;THEN&lt;/font&gt;&lt;/span&gt;&amp;#160; &lt;span style="color:;"&gt;&lt;font color="#ff00ff"&gt;UPDATE&lt;/font&gt;&lt;/span&gt;	
			&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;SET&lt;/font&gt;&lt;/span&gt;	tgt&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;.&lt;/font&gt;&lt;/span&gt;NAME &lt;span style="color:;"&gt;&lt;font color="#808080"&gt;=&lt;/font&gt;&lt;/span&gt; src&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;.&lt;/font&gt;&lt;/span&gt;NAME&amp;#160;&amp;#160; &lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;WHEN&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;NOT&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;MATCHED&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;THEN&lt;/font&gt;&lt;/span&gt;&amp;#160;&amp;#160; &lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;INSERT&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;(&lt;/font&gt;&lt;/span&gt;id&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;,&lt;/font&gt;&lt;/span&gt;name&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;)&lt;/font&gt;&lt;/span&gt;
			&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;VALUES&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;(&lt;/font&gt;&lt;/span&gt;src&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;.&lt;/font&gt;&lt;/span&gt;id&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;,&lt;/font&gt;&lt;/span&gt;src&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;.&lt;/font&gt;&lt;/span&gt;name&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;)&lt;/font&gt;&lt;/span&gt;
		&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;OUTPUT&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#ff00ff"&gt;$ACTION&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;AS&lt;/font&gt;&lt;/span&gt; action_
		&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;,&lt;/font&gt;&lt;/span&gt;		INSERTED&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;.&lt;/font&gt;&lt;/span&gt;id &lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;AS&lt;/font&gt;&lt;/span&gt; inserted_id
		&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;,&lt;/font&gt;&lt;/span&gt;		INSERTED&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;.&lt;/font&gt;&lt;/span&gt;NAME &lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;AS&lt;/font&gt;&lt;/span&gt; inserted_name
		&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;,&lt;/font&gt;&lt;/span&gt;		DELETED&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;.&lt;/font&gt;&lt;/span&gt;id &lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;AS&lt;/font&gt;&lt;/span&gt; deleted_id
		&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;,&lt;/font&gt;&lt;/span&gt;		DELETED&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;.&lt;/font&gt;&lt;/span&gt;name &lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;AS&lt;/font&gt;&lt;/span&gt; deleted_name
		&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;)&lt;/font&gt;&lt;/span&gt;mrgout
&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;;&lt;/font&gt;&lt;/span&gt;
&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;INSERT&lt;/font&gt;&lt;/span&gt;	dbo&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;.&lt;/font&gt;&lt;/span&gt;old_values&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;(&lt;/font&gt;&lt;/span&gt;id&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;,&lt;/font&gt;&lt;/span&gt;name&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;)&lt;/font&gt;&lt;/span&gt;
&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;SELECT&lt;/font&gt;&lt;/span&gt;	deleted_id&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;,&lt;/font&gt;&lt;/span&gt;deleted_name &lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;FROM&lt;/font&gt;&lt;/span&gt; mrgout
&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;WHERE&lt;/font&gt;&lt;/span&gt;	mrgout&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;.&lt;/font&gt;&lt;/span&gt;action_ &lt;span style="color:;"&gt;&lt;font color="#808080"&gt;=&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#ff0000"&gt;'UPDATE'&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#008000"&gt;--Filtering on $action=UPDATE allows us to get the replaced values from DELETED virtual table&lt;/font&gt;&lt;/span&gt;
&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;SELECT&lt;/font&gt;&lt;/span&gt;	[INSERT_@@ROWCOUNT]&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;=(&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;SELECT&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#ff00ff"&gt;COUNT&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;(*)&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;FROM&lt;/font&gt;&lt;/span&gt; mrgout &lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;WHERE&lt;/font&gt;&lt;/span&gt; action_ &lt;span style="color:;"&gt;&lt;font color="#808080"&gt;=&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#ff0000"&gt;'INSERT'&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;),&lt;/font&gt;&lt;/span&gt;[UPDATE_@@ROWCOUNT]&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;=(&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;SELECT&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#ff00ff"&gt;COUNT&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;(*)&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;FROM&lt;/font&gt;&lt;/span&gt; mrgout &lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;WHERE&lt;/font&gt;&lt;/span&gt; action_ &lt;span style="color:;"&gt;&lt;font color="#808080"&gt;=&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#ff0000"&gt;'UPDATE'&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;),&lt;/font&gt;&lt;/span&gt;row_tally_in_tgt&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;=(&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;SELECT&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#ff00ff"&gt;COUNT&lt;/font&gt;&lt;/span&gt;&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;(*)&lt;/font&gt;&lt;/span&gt;&amp;#160;&lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;FROM&lt;/font&gt;&lt;/span&gt; tgt&lt;span style="color:;"&gt;&lt;font color="#808080"&gt;)&lt;/font&gt;&lt;/span&gt;&amp;#160;&amp;#160; &lt;span style="color:;"&gt;&lt;font color="#0000ff"&gt;GO&lt;/font&gt;&lt;/span&gt; 2
&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Executing that returns:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_1FDC7BBA.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_13DA8B86.png" width="459" height="171" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is much better. We now know the tally of insertions and updates committed by the MERGE, unfortunately we have had to do it in two separate statements which in a way defeats the point of using MERGE in the first place (and don’t forget some of the other &lt;a href="http://www.sqlperformance.com/2013/02/t-sql-queries/another-merge-bug" target="_blank"&gt;current problems with MERGE&lt;/a&gt;). If you can think of a better way of doing it then I’m all ears – please reply in the &lt;a href="http://sqlblog.com/blogs/jamie_thomson/archive/2013/02/07/obtaining-rowcounts-when-using-composable-dml.aspx#comments" target="_blank"&gt;comments&lt;/a&gt; below.&lt;/p&gt;

&lt;p&gt;I’m not saying don’t use MERGE and I’m not saying don’t use Composable DML; just be aware of their limitations. Personally I think there should be built-in functions, similar to &lt;span style="color:;"&gt;&lt;font color="#ff00ff"&gt;@@ROWCOUNT&lt;/font&gt;&lt;/span&gt;, that return the number of rows INSERTed/DELETEd/UPDATEd by a MERGE; &lt;a href="http://sqlblog.com/blogs/aaron_bertrand/" target="_blank"&gt;Aaron Bertrand&lt;/a&gt; agreed and raised a Connect submission to that affect: &lt;a title="https://connect.microsoft.com/SQLServer/feedback/details/298395/katmai-merge-does-not-distinguish-rowcounts-in-triggers" href="https://connect.microsoft.com/SQLServer/feedback/details/298395/katmai-merge-does-not-distinguish-rowcounts-in-triggers" target="_blank"&gt;Katmai : Merge does not distinguish rowcounts in triggers&lt;/a&gt; which has, unfortunately, “been closed as won’t fix”.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://twitter.com/jamiet" target="_blank"&gt;@Jamiet&lt;/a&gt;&lt;/p&gt;&lt;img src="http://sqlblog.com/aggbug.aspx?PostID=47531" width="1" height="1"&gt;</description><category domain="http://sqlblog.com/blogs/jamie_thomson/archive/tags/Composable+DML/default.aspx">Composable DML</category><category domain="http://sqlblog.com/blogs/jamie_thomson/archive/tags/merge/default.aspx">merge</category><category domain="http://sqlblog.com/blogs/jamie_thomson/archive/tags/sql+server/default.aspx">sql server</category><category domain="http://sqlblog.com/blogs/jamie_thomson/archive/tags/t-sql/default.aspx">t-sql</category></item><item><title>The current state of a MERGE Destination for SSIS</title><link>http://sqlblog.com/blogs/jamie_thomson/archive/2012/12/07/the-current-state-of-a-merge-destination-for-ssis.aspx</link><pubDate>Fri, 07 Dec 2012 11:18:45 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:46555</guid><dc:creator>jamiet</dc:creator><slash:comments>2</slash:comments><comments>http://sqlblog.com/blogs/jamie_thomson/comments/46555.aspx</comments><wfw:commentRss>http://sqlblog.com/blogs/jamie_thomson/commentrss.aspx?PostID=46555</wfw:commentRss><wfw:comment>http://sqlblog.com/blogs/jamie_thomson/rsscomments.aspx?PostID=46555</wfw:comment><description>&lt;p&gt;&lt;a href="http://sqlsmurf.wordpress.com/" target="_blank"&gt;Hugo Tap&lt;/a&gt; asked me &lt;a href="https://twitter.com/sqlsmurf/status/276990938805587968" target="_blank"&gt;on Twitter earlier today&lt;/a&gt; whether or not there existed a SSIS Dataflow Destination component that enabled one to MERGE data into a table rather than INSERT it. Its a common request so I thought it might be useful to summarise the current state of play as regards a MERGE destination for SSIS.&lt;/p&gt;  &lt;p&gt;Firstly, there is no MERGE destination component in the box; that is, when you install SSIS no MERGE Destination will be available. That being said the SSIS team have made available a MERGE destination component via Codeplex which you can get from &lt;a title="http://sqlsrvintegrationsrv.codeplex.com/releases/view/19048" href="http://sqlsrvintegrationsrv.codeplex.com/releases/view/19048"&gt;http://sqlsrvintegrationsrv.codeplex.com/releases/view/19048&lt;/a&gt;. &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_2F4C9602.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_26E8C0AB.png" width="499" height="400" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I have never used it so cannot vouch for its usefulness although judging by some of the reviews you might not want to set your expectations too high. Your mileage may vary.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;In the past it has occurred to me that a built-in way to provide MERGE from the SSIS pipeline would be highly valuable. I assume that this would have to be provided by the database into which you were merging hence in March 2010 I submitted the following two requests to Connect:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="https://connect.microsoft.com/SQLServer/feedback/details/540038/bulk-merge" target="_blank"&gt;BULK MERGE&lt;/a&gt; (111 votes at the time of writing)&lt;/li&gt;    &lt;li&gt;&lt;a href="https://connect.microsoft.com/SQLServer/feedback/details/542924/ssis-bulk-merge-destination" target="_blank"&gt;[SSIS] BULK MERGE Destination&lt;/a&gt; (15 votes)&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;If you think these would be useful feel free to vote them up and add a comment.&lt;/p&gt;  &lt;p&gt;Lastly, this one is nothing to do with SSIS but if you want to perform a minimally logged MERGE using T-SQL Sunil Agarwal has explained how at &lt;a href="http://blogs.msdn.com/b/sqlserverstorageengine/archive/2010/06/03/minimal-logging-and-merge-statement.aspx" target="_blank"&gt;Minimal logging and MERGE statement&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://twitter.com/jamiet" target="_blank"&gt;@Jamiet&lt;/a&gt;&lt;/p&gt;&lt;img src="http://sqlblog.com/aggbug.aspx?PostID=46555" width="1" height="1"&gt;</description><category domain="http://sqlblog.com/blogs/jamie_thomson/archive/tags/merge/default.aspx">merge</category><category domain="http://sqlblog.com/blogs/jamie_thomson/archive/tags/sql+server+integration+services/default.aspx">sql server integration services</category><category domain="http://sqlblog.com/blogs/jamie_thomson/archive/tags/ssis/default.aspx">ssis</category></item><item><title>MERGE and OUTPUT – the swiss army knife of T-SQL</title><link>http://sqlblog.com/blogs/jamie_thomson/archive/2010/01/06/merge-and-output-the-swiss-army-knife-of-t-sql.aspx</link><pubDate>Wed, 06 Jan 2010 18:46:22 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:20639</guid><dc:creator>jamiet</dc:creator><slash:comments>6</slash:comments><comments>http://sqlblog.com/blogs/jamie_thomson/comments/20639.aspx</comments><wfw:commentRss>http://sqlblog.com/blogs/jamie_thomson/commentrss.aspx?PostID=20639</wfw:commentRss><wfw:comment>http://sqlblog.com/blogs/jamie_thomson/rsscomments.aspx?PostID=20639</wfw:comment><description>&lt;p&gt;The new T-SQL MERGE statement in SQL Server 2008 seems to be finding many uses over and above its de facto UPSERT usage scenario, probably the most popular of which is its ability to update one table from another in an ANSI-compliant manner as detailed expertly by Hugo Kornelius in his blog post &lt;a href="http://sqlblog.com/blogs/hugo_kornelis/archive/2008/03/10/lets-deprecate-update-from.aspx" target="_blank"&gt;Let's deprecate UPDATE FROM!&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Today I stumbled upon a different use for it, returning values using an OUTPUT clause from a table used as the source of data for an insertion. In other words, if I’m inserting from [tableA] into [tableB] then I may want some values from [tableA] after the fact, &lt;em&gt;particularly&lt;/em&gt; if [tableB] has an identity. Observe my first attempt using a straight insertion where I am trying to get a field from &lt;font face="Courier New"&gt;@source.[id]&lt;/font&gt; that is not used in the insertion:&lt;/p&gt;  &lt;blockquote&gt;   &lt;table cellspacing="0" cellpadding="0" bgcolor="#eeeeee"&gt;       &lt;tr&gt;         &lt;td&gt;           &lt;pre style="padding-bottom:10px;padding-left:20px;padding-right:20px;font-family:consolas,lucida console,courier new,courier;font-size:12px;padding-top:10px;-moz-background-clip:border;-moz-background-origin:padding;-moz-background-inline-policy:continuous;"&gt;&lt;font color="blue"&gt;DECLARE &lt;/font&gt;&lt;font color="#434343"&gt;@source &lt;/font&gt;&lt;font color="blue"&gt;TABLE &lt;/font&gt;&lt;font color="gray"&gt;(
&lt;br /&gt;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="black"&gt;[id] &lt;/font&gt;&lt;font color="blue"&gt;INT PRIMARY KEY
&lt;br /&gt;&lt;/font&gt;&lt;font color="gray"&gt;,&amp;#160; &lt;/font&gt;&lt;font color="black"&gt;[name] &lt;/font&gt;&lt;font color="blue"&gt;VARCHAR&lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="black"&gt;10&lt;/font&gt;&lt;font color="gray"&gt;)
&lt;br /&gt;);
&lt;br /&gt;&lt;/font&gt;&lt;font color="blue"&gt;INSERT &lt;/font&gt;&lt;font color="#434343"&gt;@source &lt;/font&gt;&lt;font color="blue"&gt;VALUES&lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="black"&gt;1000&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="red"&gt;'Harold'&lt;/font&gt;&lt;font color="gray"&gt;),(&lt;/font&gt;&lt;font color="black"&gt;2000&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="red"&gt;'Madge'&lt;/font&gt;&lt;font color="gray"&gt;);
&lt;br /&gt;&lt;/font&gt;&lt;font color="blue"&gt;DECLARE &lt;/font&gt;&lt;font color="#434343"&gt;@destination &lt;/font&gt;&lt;font color="blue"&gt;TABLE &lt;/font&gt;&lt;font color="gray"&gt;(
&lt;br /&gt;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="black"&gt;[id] &lt;/font&gt;&lt;font color="blue"&gt;INT PRIMARY KEY &lt;/font&gt;&lt;font color="#434343"&gt;IDENTITY&lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="black"&gt;1&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="black"&gt;1&lt;/font&gt;&lt;font color="gray"&gt;)
&lt;br /&gt;,&amp;#160; &lt;/font&gt;&lt;font color="black"&gt;NAME &lt;/font&gt;&lt;font color="blue"&gt;VARCHAR&lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="black"&gt;10&lt;/font&gt;&lt;font color="gray"&gt;)
&lt;br /&gt;);
&lt;br /&gt;
&lt;br /&gt;&lt;/font&gt;&lt;font color="blue"&gt;INSERT &lt;/font&gt;&lt;font color="#434343"&gt;@destination &lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="black"&gt;[name]&lt;/font&gt;&lt;font color="gray"&gt;)
&lt;br /&gt;&lt;/font&gt;&lt;font color="black"&gt;OUTPUT INSERTED.[id] &lt;/font&gt;&lt;font color="blue"&gt;AS &lt;/font&gt;&lt;font color="magenta"&gt;NEWID&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="black"&gt;[source].[id] &lt;/font&gt;&lt;font color="blue"&gt;AS &lt;/font&gt;&lt;font color="black"&gt;OldId
&lt;br /&gt;&lt;/font&gt;&lt;font color="blue"&gt;SELECT &lt;/font&gt;&lt;font color="black"&gt;[name]
&lt;br /&gt;&lt;/font&gt;&lt;font color="blue"&gt;FROM&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#434343"&gt;@source&lt;/font&gt;&lt;font color="gray"&gt;;&lt;/font&gt;&lt;/pre&gt;
        &lt;/td&gt;
      &lt;/tr&gt;
    &lt;/table&gt;
&lt;/blockquote&gt;

&lt;p&gt;This failed with the error:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_37392ABD.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_468C8CCC.png" width="491" height="107" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;The reason this fails is that the INSERT statement has no FROM clause thus the OUTPUT clause can never know about where the data is sourced from; the FROM clause in the SELECT that is used to source the data for the insertion is not actually part of the INSERT statement. Let’s try this with a MERGE instead:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;table cellspacing="0" cellpadding="0" bgcolor="#eeeeee"&gt;
      &lt;tr&gt;
        &lt;td&gt;
          &lt;pre style="padding-bottom:10px;padding-left:20px;padding-right:20px;font-family:consolas,lucida console,courier new,courier;font-size:12px;padding-top:10px;-moz-background-clip:border;-moz-background-origin:padding;-moz-background-inline-policy:continuous;"&gt;&lt;font color="blue"&gt;DECLARE &lt;/font&gt;&lt;font color="#434343"&gt;@source &lt;/font&gt;&lt;font color="blue"&gt;TABLE &lt;/font&gt;&lt;font color="gray"&gt;(
&lt;br /&gt;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="black"&gt;[id] &lt;/font&gt;&lt;font color="blue"&gt;INT PRIMARY KEY
&lt;br /&gt;&lt;/font&gt;&lt;font color="gray"&gt;,&amp;#160; &lt;/font&gt;&lt;font color="black"&gt;[name] &lt;/font&gt;&lt;font color="blue"&gt;VARCHAR&lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="black"&gt;10&lt;/font&gt;&lt;font color="gray"&gt;)
&lt;br /&gt;);
&lt;br /&gt;&lt;/font&gt;&lt;font color="blue"&gt;INSERT &lt;/font&gt;&lt;font color="#434343"&gt;@source &lt;/font&gt;&lt;font color="blue"&gt;VALUES&lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="black"&gt;1000&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="red"&gt;'Harold'&lt;/font&gt;&lt;font color="gray"&gt;),(&lt;/font&gt;&lt;font color="black"&gt;2000&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="red"&gt;'Madge'&lt;/font&gt;&lt;font color="gray"&gt;);
&lt;br /&gt;&lt;/font&gt;&lt;font color="blue"&gt;DECLARE &lt;/font&gt;&lt;font color="#434343"&gt;@destination &lt;/font&gt;&lt;font color="blue"&gt;TABLE &lt;/font&gt;&lt;font color="gray"&gt;(
&lt;br /&gt;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="black"&gt;[id] &lt;/font&gt;&lt;font color="blue"&gt;INT PRIMARY KEY &lt;/font&gt;&lt;font color="#434343"&gt;IDENTITY&lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="black"&gt;1&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="black"&gt;1&lt;/font&gt;&lt;font color="gray"&gt;)
&lt;br /&gt;,&amp;#160; &lt;/font&gt;&lt;font color="black"&gt;NAME &lt;/font&gt;&lt;font color="blue"&gt;VARCHAR&lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="black"&gt;10&lt;/font&gt;&lt;font color="gray"&gt;)
&lt;br /&gt;);
&lt;br /&gt;
&lt;br /&gt;&lt;/font&gt;&lt;font color="black"&gt;MERGE&amp;#160; &lt;/font&gt;&lt;font color="#434343"&gt;@destination
&lt;br /&gt;&lt;/font&gt;&lt;font color="black"&gt;USING&amp;#160; &lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="blue"&gt;SELECT &lt;/font&gt;&lt;font color="black"&gt;[id]&lt;/font&gt;&lt;font color="gray"&gt;, &lt;/font&gt;&lt;font color="black"&gt;[name] &lt;/font&gt;&lt;font color="blue"&gt;FROM &lt;/font&gt;&lt;font color="#434343"&gt;@source&lt;/font&gt;&lt;font color="gray"&gt;) &lt;/font&gt;&lt;font color="blue"&gt;AS &lt;/font&gt;&lt;font color="black"&gt;[source]
&lt;br /&gt;&lt;/font&gt;&lt;font color="blue"&gt;ON&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="black"&gt;1&lt;/font&gt;&lt;font color="blue"&gt;=&lt;/font&gt;&lt;font color="black"&gt;0&lt;/font&gt;&lt;font color="gray"&gt;) &lt;/font&gt;&lt;font color="green"&gt;--arbitrary join condition
&lt;br /&gt;&lt;/font&gt;&lt;font color="blue"&gt;WHEN&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="gray"&gt;NOT &lt;/font&gt;&lt;font color="black"&gt;MATCHED &lt;/font&gt;&lt;font color="blue"&gt;THEN
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; INSERT &lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="black"&gt;name&lt;/font&gt;&lt;font color="gray"&gt;)
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="blue"&gt;VALUES&amp;#160; &lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="black"&gt;source.Name&lt;/font&gt;&lt;font color="gray"&gt;)
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="black"&gt;OUTPUT&amp;#160; INSERTED.id &lt;/font&gt;&lt;font color="blue"&gt;AS &lt;/font&gt;&lt;font color="magenta"&gt;NEWID&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="black"&gt;[source].[id] &lt;/font&gt;&lt;font color="blue"&gt;AS &lt;/font&gt;&lt;font color="black"&gt;OldId&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="black"&gt;INSERTED.name&lt;/font&gt;&lt;font color="gray"&gt;; &lt;/font&gt;&lt;/pre&gt;
        &lt;/td&gt;
      &lt;/tr&gt;
    &lt;/table&gt;
&lt;/blockquote&gt;

&lt;p&gt;This worked!&lt;/p&gt;

&lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_12E4206E.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_71F0ADC6.png" width="233" height="116" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Notice how we are able to reference the source of our data in the OUTPUT clause of of our MERGE statement which we couldn’t do when using INSERT. Pretty cool huh!&lt;/p&gt;

&lt;p&gt;I remembered while writing this that Adam Machanic has already documented this capability in his blog post &lt;a href="http://sqlblog.com/blogs/adam_machanic/archive/2009/08/24/dr-output-or-how-i-learned-to-stop-worrying-and-love-the-merge.aspx" target="_blank"&gt;Dr. OUTPUT or: How I Learned to Stop Worrying and Love the MERGE&lt;/a&gt; and he has covered it in a lot more detail than I have here but still, I see no harm in reiterating and the code above is an easily executable demo of this cool little feature.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://twitter.com/jamiet" target="_blank"&gt;@Jamiet&lt;/a&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;N.B. Thanks to &lt;a href="http://twitter.com/aaronbertrand"&gt;Aaron Bertrand&lt;/a&gt; for his instructions &lt;a href="http://sqlblog.com/blogs/merrill_aldrich/archive/2009/11/24/getting-less-stupid-about-html-code-formatting.aspx"&gt;here&lt;/a&gt; on producing well-formatted T-SQL code for blogs! I’m putting this comment here so I know where to find it next time!&lt;/p&gt;&lt;img src="http://sqlblog.com/aggbug.aspx?PostID=20639" width="1" height="1"&gt;</description><category domain="http://sqlblog.com/blogs/jamie_thomson/archive/tags/merge/default.aspx">merge</category><category domain="http://sqlblog.com/blogs/jamie_thomson/archive/tags/t-sql/default.aspx">t-sql</category></item><item><title>Extracting insert, update, delete rowcounts from T-SQL MERGE</title><link>http://sqlblog.com/blogs/jamie_thomson/archive/2009/08/30/extracting-insert-update-delete-rowcounts-from-t-sql-merge.aspx</link><pubDate>Sat, 29 Aug 2009 23:54:16 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:16395</guid><dc:creator>jamiet</dc:creator><slash:comments>9</slash:comments><comments>http://sqlblog.com/blogs/jamie_thomson/comments/16395.aspx</comments><wfw:commentRss>http://sqlblog.com/blogs/jamie_thomson/commentrss.aspx?PostID=16395</wfw:commentRss><wfw:comment>http://sqlblog.com/blogs/jamie_thomson/rsscomments.aspx?PostID=16395</wfw:comment><description>&lt;p&gt;Just lately I’ve been using T-SQL’s MERGE statement (introduced in SQL Server 2008) and one thing that I needed to do was extract rowcounts for each DML operation (i.e. INSERT, UPDATE, DELETE) conducted by a MERGE. I was surprised to find that while &lt;font color="#ff00ff"&gt;@@ROWCOUNT&lt;/font&gt; is supported for MERGE, it only returns the total number of affected rows and there are no built in functions for getting the counts for each DML operation (although &lt;a href="http://sqlblog.com/blogs/aaron_bertrand/"&gt;Aaron Bertrand&lt;/a&gt; has &lt;a href="https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=298395"&gt;a Connect submission&lt;/a&gt; asking for it). &lt;/p&gt;  &lt;p&gt;There is an easy way around this however; MERGE includes a function called &lt;font color="#ff00ff"&gt;$action&lt;/font&gt; which can be used in the OUTPUT clause to specify whether a row was inserted, updated or deleted. I cut a small bit of code that demos how it works which you can get at the bottom of this blog post. Here’s what it produces:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_08D5D293.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_730BEA35.png" width="186" height="114" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;I hope its useful to someone!&lt;/p&gt;  &lt;p&gt;If you want to learn more about the MERGE statement and the OUTPUT clause then head over and read Adam Machanic’s post &lt;a href="http://sqlblog.com/blogs/adam_machanic/archive/2009/08/24/dr-output-or-how-i-learned-to-stop-worrying-and-love-the-merge.aspx"&gt;Dr OUTPUT: Or how I learned to stop worrying and love the MERGE&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://twitter.com/jamiet"&gt;@Jamiet&lt;/a&gt;&lt;/p&gt;  &lt;hr /&gt;  &lt;p&gt;Here’s the code!! Disclaimer: Take it or leave it – just don’t shout at me if there are any problems here (although constructive comments are welcomed)&lt;/p&gt;  &lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:820px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;   &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;&lt;span style="color:#0000ff;"&gt;set&lt;/span&gt; nocount &lt;span style="color:#0000ff;"&gt;on&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;create&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;table&lt;/span&gt; #t&lt;br /&gt;(&lt;br /&gt;    id &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;&lt;br /&gt;,    name &lt;span style="color:#0000ff;"&gt;varchar&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;max&lt;/span&gt;)&lt;br /&gt;);&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;insert #t &lt;span style="color:#0000ff;"&gt;values&lt;/span&gt; (1,&lt;span style="color:#006080;"&gt;'Jim'&lt;/span&gt;),(2,&lt;span style="color:#006080;"&gt;'Sarah'&lt;/span&gt;),(3,&lt;span style="color:#006080;"&gt;'Hels'&lt;/span&gt;);&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;DECLARE&lt;/span&gt; @rowcounts &lt;span style="color:#0000ff;"&gt;TABLE&lt;/span&gt;&lt;br /&gt;(&lt;br /&gt;    mergeAction nvarchar(10)&lt;br /&gt;);&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;declare&lt;/span&gt; @insertCount &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;, @updateCount &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;, @deleteCount &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;;&lt;br /&gt;merge &lt;span style="color:#0000ff;"&gt;into&lt;/span&gt; #t &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; tgt&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (    &lt;span style="color:#0000ff;"&gt;select&lt;/span&gt; 1 &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; id, &lt;span style="color:#006080;"&gt;'James'&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; name&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;union&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;select&lt;/span&gt; 2, &lt;span style="color:#006080;"&gt;'Sarah'&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;union&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;select&lt;/span&gt; 3, &lt;span style="color:#006080;"&gt;'Helen'&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;union&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;select&lt;/span&gt; 4, &lt;span style="color:#006080;"&gt;'Jack'&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;union&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;select&lt;/span&gt; 5, &lt;span style="color:#006080;"&gt;'Annie'&lt;/span&gt;) &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; src&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;on&lt;/span&gt;    tgt.id = src.id&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;when&lt;/span&gt; matched &lt;span style="color:#0000ff;"&gt;and&lt;/span&gt; tgt.name = src.name &lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;THEN&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;DELETE&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;when&lt;/span&gt; matched &lt;span style="color:#0000ff;"&gt;and&lt;/span&gt; tgt.name &amp;lt;&amp;gt; src.name&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;THEN&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;UPDATE&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;SET&lt;/span&gt; tgt.name = src.name&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;when&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;not&lt;/span&gt; matched&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;THEN&lt;/span&gt; insert &lt;span style="color:#0000ff;"&gt;values&lt;/span&gt; (src.id, src.name)&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;OUTPUT&lt;/span&gt; $&lt;span style="color:#0000ff;"&gt;action&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;into&lt;/span&gt; @rowcounts;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;select&lt;/span&gt;    @insertcount=[INSERT]&lt;br /&gt;,        @updatecount=[&lt;span style="color:#0000ff;"&gt;UPDATE&lt;/span&gt;]&lt;br /&gt;,        @deletecount=[&lt;span style="color:#0000ff;"&gt;DELETE&lt;/span&gt;]&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;from&lt;/span&gt;    (&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;select&lt;/span&gt;    mergeAction,1 &lt;span style="color:#0000ff;"&gt;rows&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;from&lt;/span&gt;    @rowcounts&lt;br /&gt;        )p&lt;br /&gt;pivot&lt;br /&gt;(&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;count&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;rows&lt;/span&gt;)&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;FOR&lt;/span&gt;    mergeAction &lt;span style="color:#0000ff;"&gt;IN&lt;/span&gt; &lt;br /&gt;(    [INSERT], [&lt;span style="color:#0000ff;"&gt;UPDATE&lt;/span&gt;], [&lt;span style="color:#0000ff;"&gt;DELETE&lt;/span&gt;])&lt;br /&gt;) &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; pvt&lt;br /&gt;;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;drop&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;table&lt;/span&gt; #t;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;print&lt;/span&gt;    &lt;span style="color:#006080;"&gt;'@insertcount = '&lt;/span&gt; + &lt;span style="color:#0000ff;"&gt;cast&lt;/span&gt;(@insertcount &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;varchar&lt;/span&gt;);&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;print&lt;/span&gt;    &lt;span style="color:#006080;"&gt;'@updatecount = '&lt;/span&gt; + &lt;span style="color:#0000ff;"&gt;cast&lt;/span&gt;(@updatecount &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;varchar&lt;/span&gt;);&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;print&lt;/span&gt;    &lt;span style="color:#006080;"&gt;'@deletecount = '&lt;/span&gt; + &lt;span style="color:#0000ff;"&gt;cast&lt;/span&gt;(@deletecount &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;varchar&lt;/span&gt;);&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;&lt;img src="http://sqlblog.com/aggbug.aspx?PostID=16395" width="1" height="1"&gt;</description><category domain="http://sqlblog.com/blogs/jamie_thomson/archive/tags/merge/default.aspx">merge</category><category domain="http://sqlblog.com/blogs/jamie_thomson/archive/tags/sql+server/default.aspx">sql server</category><category domain="http://sqlblog.com/blogs/jamie_thomson/archive/tags/t-sql/default.aspx">t-sql</category></item></channel></rss>