Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • Home
  • SEARCH
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 4078926
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 20, 20262026-05-20T17:44:07+00:00 2026-05-20T17:44:07+00:00

Very simplified, I have two tables Source and Target. declare @Source table (SourceID int

  • 0

Very simplified, I have two tables Source and Target.

declare @Source table (SourceID int identity(1,2), SourceName varchar(50))
declare @Target table (TargetID int identity(2,2), TargetName varchar(50))

insert into @Source values ('Row 1'), ('Row 2')

I would like to move all rows from @Source to @Target and know the TargetID for each SourceID because there are also the tables SourceChild and TargetChild that needs to be copied as well and I need to add the new TargetID into TargetChild.TargetID FK column.

There are a couple of solutions to this.

  1. Use a while loop or cursors to insert one row (RBAR) to Target at a time and use scope_identity() to fill the FK of TargetChild.
  2. Add a temp column to @Target and insert SourceID. You can then join that column to fetch the TargetID for the FK in TargetChild.
  3. SET IDENTITY_INSERT OFF for @Target and handle assigning new values yourself. You get a range that you then use in TargetChild.TargetID.

I’m not all that fond of any of them. The one I used so far is cursors.

What I would really like to do is to use the output clause of the insert statement.

insert into @Target(TargetName)
output inserted.TargetID, S.SourceID
select SourceName
from @Source as S

But it is not possible

The multi-part identifier "S.SourceID" could not be bound.

But it is possible with a merge.

merge @Target as T
using @Source as S
on 0=1
when not matched then
  insert (TargetName) values (SourceName)
output inserted.TargetID, S.SourceID;

Result

TargetID    SourceID
----------- -----------
2           1
4           3

I want to know if you have used this? If you have any thoughts about the solution or see any problems with it? It works fine in simple scenarios but perhaps something ugly could happen when the query plan get really complicated due to a complicated source query. Worst scenario would be that the TargetID/SourceID pairs actually isn’t a match.

MSDN has this to say about the from_table_name of the output clause.

Is a column prefix that specifies a table included in the FROM clause of a DELETE, UPDATE, or MERGE statement that is used to specify the rows to update or delete.

For some reason they don’t say “rows to insert, update or delete” only “rows to update or delete”.

Any thoughts are welcome and totally different solutions to the original problem is much appreciated.

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-20T17:44:08+00:00Added an answer on May 20, 2026 at 5:44 pm

    In my opinion this is a great use of MERGE and output. I’ve used in several scenarios and haven’t experienced any oddities to date.
    For example, here is test setup that clones a Folder and all Files (identity) within it into a newly created Folder (guid).

    DECLARE @FolderIndex TABLE (FolderId UNIQUEIDENTIFIER PRIMARY KEY, FolderName varchar(25));
    INSERT INTO @FolderIndex 
        (FolderId, FolderName)
        VALUES(newid(), 'OriginalFolder');
    
    DECLARE @FileIndex TABLE (FileId int identity(1,1) PRIMARY KEY, FileName varchar(10));
    INSERT INTO @FileIndex 
        (FileName)
        VALUES('test.txt');
    
    DECLARE @FileFolder TABLE (FolderId UNIQUEIDENTIFIER, FileId int, PRIMARY KEY(FolderId, FileId));
    INSERT INTO @FileFolder 
        (FolderId, FileId)
        SELECT  FolderId, 
                FileId
        FROM    @FolderIndex
        CROSS JOIN  @FileIndex;  -- just to illustrate
    
    DECLARE @sFolder TABLE (FromFolderId UNIQUEIDENTIFIER, ToFolderId UNIQUEIDENTIFIER);
    DECLARE @sFile TABLE (FromFileId int, ToFileId int);
    
    -- copy Folder Structure
    MERGE @FolderIndex fi
    USING   (   SELECT  1 [Dummy],
                        FolderId, 
                        FolderName
                FROM    @FolderIndex [fi]
                WHERE   FolderName = 'OriginalFolder'
            ) d ON  d.Dummy = 0
    WHEN NOT MATCHED 
    THEN INSERT 
        (FolderId, FolderName)
        VALUES (newid(), 'copy_'+FolderName)
    OUTPUT  d.FolderId,
            INSERTED.FolderId
    INTO    @sFolder (FromFolderId, toFolderId);
    
    -- copy File structure
    MERGE   @FileIndex fi
    USING   (   SELECT  1 [Dummy],
                        fi.FileId, 
                        fi.[FileName]
                FROM    @FileIndex fi
                INNER
                JOIN    @FileFolder fm ON 
                        fi.FileId = fm.FileId
                INNER
                JOIN    @FolderIndex fo ON 
                        fm.FolderId = fo.FolderId
                WHERE   fo.FolderName = 'OriginalFolder'
            ) d ON  d.Dummy = 0
    WHEN NOT MATCHED 
    THEN INSERT ([FileName])
        VALUES ([FileName])
    OUTPUT  d.FileId,
            INSERTED.FileId
    INTO    @sFile (FromFileId, toFileId);
    
    -- link new files to Folders
    INSERT INTO @FileFolder (FileId, FolderId)
        SELECT  sfi.toFileId, sfo.toFolderId
        FROM    @FileFolder fm
        INNER
        JOIN    @sFile sfi ON  
                fm.FileId = sfi.FromFileId
        INNER
        JOIN    @sFolder sfo ON 
                fm.FolderId = sfo.FromFolderId
    -- return    
    SELECT  * 
    FROM    @FileIndex fi 
    JOIN    @FileFolder ff ON  
            fi.FileId = ff.FileId 
    JOIN    @FolderIndex fo ON  
            ff.FolderId = fo.FolderId
    
    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I have a MySql db with innoDB tables. Very simplified this is how two
I have a linq to sql database. Very simplified we have 3 tables, Projects
Let us say I have a table (everything is very much simplified): create table
I have two tables detail and head. The detail table will be written first.
First, a little background (greatly simplified): I have two classes, one called Entity and
I have the following simplified table structure in a SQL 2000 Databse: ID AppName
I need to quickly build a parser for a very simplified version of a
Very simply put: I have a class that consists mostly of static public members,
Very simply put, I have the following code snippet: FILE* test = fopen(C:\\core.u, w);
So I have two copies of exactly the same project. The configuration of the

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.