• I know this is an old one, but I needed an answer to this and couldn't find one. Below is how I solved the problem, with the sample code addressing your original problem, for anybody else who wanders across this thread. It's not especially efficient (and would naturally be less-so with more columns in the tables) but 'works', and will play nicely in multi-user environment.

    BEGIN TRANSACTION

    DECLARE @Today DATETIME

    SET @Today = GETDATE()

    DECLARE @Temp TABLE

    (

    ID INT ,

    [val1] [varchar](50) ,

    [val2] [varchar](50) ,

    [val3] [varchar](50) ,

    [entryDate] [datetime]

    )

    INSERT INTO [dbo].[TableA]

    ( val1 ,

    val2 ,

    val3 ,

    entryDate

    )

    OUTPUT INSERTED.ID ,

    INSERTED.val1 ,

    INSERTED.val2 ,

    INSERTED.val3 ,

    INSERTED.entryDate

    INTO @Temp

    SELECT val1 ,

    val2 ,

    val3 ,

    entryDate

    FROM [dbo].[TableC]

    INSERT INTO [dbo].[TableB]

    ( TableAID ,

    comID ,

    RelationshipID ,

    xPercent ,

    [status] ,

    dateBegin

    )

    SELECT T.ID AS TableAID ,

    C.comID AS comID ,

    1 AS RelationshipID ,

    '100.00' AS xPercent ,

    1 AS [status] ,

    @Today AS dateBegin

    FROM ( SELECT ROW_NUMBER() OVER ( ORDER BY val1 ASC, val2 ASC, val3 ASC, entryDate ASC ) AS RowNumber ,

    ID

    FROM @Temp

    ) AS T

    INNER JOIN ( SELECT ROW_NUMBER() OVER ( ORDER BY val1 ASC, val2 ASC, val3 ASC, entryDate ASC ) AS RowNumber ,

    comID

    FROM [dbo].[TableC]

    ) AS C ON T.RowNumber = C.RowNumber

    COMMIT TRANSACTION

    EDIT:

    Another, more efficient solution to this problem appears to be to use something like the following:

    merge into [table1] as t

    using [external_table] as s

    on 1=0 --modify this predicate as necessary

    when not matched then insert (data)

    values (s.[col1])

    output inserted.id, s.[col2] into [table2]

    ;