Browsing on various examples on how to create a "good" UPSERT statement shown here, I have created the following code (I have changed the column names):
BEGIN TRANSACTION
IF EXISTS (SELECT *
           FROM Table1 WITH (UPDLOCK, SERIALIZABLE), Table2
           WHERE Table1.Data3 = Table2.data3)
BEGIN
    UPDATE Table1
    SET Table1.someColumn = Table2.someColumn,
        Table1.DateData2 = GETDATE()
    FROM Table1
    INNER JOIN Table2 ON Table1.Data3 = Table2.data3
END
ELSE
BEGIN
    INSERT INTO Table1 (DataComment, Data1, Data2, Data3, Data4, DateData1, DateData2)
        SELECT  
            'some comment', data1, data2, data3, data4, GETDATE(), GETDATE()
        FROM 
            Table2
END
COMMIT TRANSACTION
My problem is, that it never does the INSERT part. The INSERT alone works fine. The current script only does the update part.
I have an idea that the insert is only good, if it can insert the entire data it finds (because of the select query)? Otherwise it won't work. If so, how can I improve it?
I have also read about the MERGE clause and would like to avoid it.  
//EDIT:
After trying out few samples found on the internet and explained here, I re-did my logic as follows:
BEGIN TRANSACTION
    BEGIN
        UPDATE table1
        SET something
        WHERE condition is met 
        UPDATE table2
        SET helpColumn = 'DONE'
        WHERE condition is met
    END
    BEGIN
        INSERT INTO table1(data)
        SELECT data
        FROM table2
        WHERE helpColumn != 'DONE'
    END
COMMIT TRANSACTION
When trying other solutions, the INSERT usually failed or ran for a long time (on a few tables, I can accept it, but not good, if you plan to migrate entire data from one database to another database).
It's probably not the best solution, I think. But for now it works, any comments?
 
     
     
    