Nia Nia - 6 months ago 15
SQL Question

SQL UPDATE or INSERT

I have tried the different solutions that found on this site when it comes to update or insert using SQL code, I got the update working but can't implement a working insert if the rows doesn't exists, the (update) code that is working looks like this, any help on how to make it insert also would be nice since I'm an *SQL Newbie, well here is the working code:

select top 0 * into #tmp_x from TTT;
select * from #tmp_x;
BULK INSERT #tmp_x FROM 'path\to\file1.csv' WITH (FIELDTERMINATOR =';',ROWTERMINATOR ='\n' ,FIRSTROW = 2);
UPDATE TTT
SET TTT.[Artikelbenämning] = #tmp_x.[Artikelbenämning],TTT.[Count of Ordernummer] = #tmp_x.[Count of Ordernummer],TTT.[Sum of Antal beställda] = #tmp_x.[Sum of Antal beställda],TTT.[Min of Skapat Datum] = #tmp_x.[Min of Skapat Datum],TTT.[Max of Planerat Plockdatum] = #tmp_x.[Max of Planerat Plockdatum],TTT.[Kommentar Inköpsplanerare] = #tmp_x.[Kommentar Inköpsplanerare]
FROM #tmp_x
WHERE TTT.Artikelnummer = #tmp_x.Artikelnummer;
drop table #tmp_x;
print 'dropped table';

Answer

If you have SQL Server 2008 or later, you can make use of the MERGE statement. The following Microsoft TechNet article describes the merge statement pretty well: https://technet.microsoft.com/en-us/library/bb522522(v=sql.105).aspx

Your query should look something like this:

    BULK INSERT #tmp_x FROM 'path\to\file1.csv' WITH (FIELDTERMINATOR =';',ROWTERMINATOR ='\n' ,FIRSTROW = 2);

    MERGE TTT AS T
    USING #tmp_x AS S
    ON (T.Artikelnummer = S.Artikelnummer) 
    WHEN NOT MATCHED BY TARGET 
        THEN INSERT(
                     [Artikelnummer]
                    ,[Artikelbenämning]
                    ,[Count of Ordernummer]
                    ,[Sum of Antal beställda]
                    ,[Min of Skapat Datum]
                    ,[Max of Planerat Plockdatum]
                    ,[Kommentar Inköpsplanerare]
                    ) 
            VALUES( 
                     S.[Artikelnummer]
                    ,S.[Artikelbenämning]
                    ,S.[Count of Ordernummer]
                    ,S.[Sum of Antal beställda]
                    ,S.[Min of Skapat Datum]
                    ,S.[Max of Planerat Plockdatum]
                    ,S.[Kommentar Inköpsplanerare]
                  )
    WHEN MATCHED 
        THEN UPDATE 
            SET      T.[Artikelbenämning] = S.[Artikelbenämning]
                    ,T.[Count of Ordernummer] = S.[Count of Ordernummer]
                    ,T.[Sum of Antal beställda] =   S.[Sum of Antal beställda]
                    ,T.[Min of Skapat Datum] =  S.[Min of Skapat Datum]
                    ,T.[Max of Planerat Plockdatum] = S.[Max of Planerat Plockdatum]
                    ,T.[Kommentar Inköpsplanerare] =    S.[Kommentar Inköpsplanerare];

                ,T.[Kommentar Inköpsplanerare] =    ISNULL(S.[Kommentar Inköpsplanerare], T.[Kommentar Inköpsplanerare]);

-- Example exludes records where [Kommentar Inköpsplanerare] IS NULL from the merge
MERGE TTT AS T
USING (
        SELECT  
                 [Artikelnummer]
                ,[Artikelbenämning]
                ,[Count of Ordernummer]
                ,[Sum of Antal beställda]
                ,[Min of Skapat Datum]
                ,[Max of Planerat Plockdatum]
                ,[Kommentar Inköpsplanerare]
        FROM     #tmp_x 
        WHERE   [Kommentar Inköpsplanerare] IS NOT NULL
      )AS S
ON (T.Artikelnummer = S.Artikelnummer) 
WHEN NOT MATCHED BY TARGET 
    THEN INSERT(
                 [Artikelnummer]
                ,[Artikelbenämning]
                ,[Count of Ordernummer]
                ,[Sum of Antal beställda]
                ,[Min of Skapat Datum]
                ,[Max of Planerat Plockdatum]
                ,[Kommentar Inköpsplanerare]
                ) 
        VALUES( 
                 S.[Artikelnummer]
                ,S.[Artikelbenämning]
                ,S.[Count of Ordernummer]
                ,S.[Sum of Antal beställda]
                ,S.[Min of Skapat Datum]
                ,S.[Max of Planerat Plockdatum]
                ,S.[Kommentar Inköpsplanerare]
              )
WHEN MATCHED 
    THEN UPDATE 
        SET      T.[Artikelbenämning] = S.[Artikelbenämning]
                ,T.[Count of Ordernummer] = S.[Count of Ordernummer]
                ,T.[Sum of Antal beställda] =   S.[Sum of Antal beställda]
                ,T.[Min of Skapat Datum] =  S.[Min of Skapat Datum]
                ,T.[Max of Planerat Plockdatum] = S.[Max of Planerat Plockdatum]
                ,T.[Kommentar Inköpsplanerare] =    S.[Kommentar Inköpsplanerare];


-- Example ignores updates on the [Kommentar Inköpsplanerare] column if the [Kommentar Inköpsplanerare] IS NULL in the source dataset
MERGE TTT AS T
USING #tmp_x AS S
ON (T.Artikelnummer = S.Artikelnummer) 
WHEN NOT MATCHED BY TARGET 
    THEN INSERT(
                 [Artikelnummer]
                ,[Artikelbenämning]
                ,[Count of Ordernummer]
                ,[Sum of Antal beställda]
                ,[Min of Skapat Datum]
                ,[Max of Planerat Plockdatum]
                ,[Kommentar Inköpsplanerare]
                ) 
        VALUES( 
                 S.[Artikelnummer]
                ,S.[Artikelbenämning]
                ,S.[Count of Ordernummer]
                ,S.[Sum of Antal beställda]
                ,S.[Min of Skapat Datum]
                ,S.[Max of Planerat Plockdatum]
                ,S.[Kommentar Inköpsplanerare]
              )
WHEN MATCHED 
    THEN UPDATE 
        SET      T.[Artikelbenämning] = S.[Artikelbenämning]
                ,T.[Count of Ordernummer] = S.[Count of Ordernummer]
                ,T.[Sum of Antal beställda] =   S.[Sum of Antal beställda]
                ,T.[Min of Skapat Datum] =  S.[Min of Skapat Datum]
                ,T.[Max of Planerat Plockdatum] = S.[Max of Planerat Plockdatum]
                ,T.[Kommentar Inköpsplanerare] =    ISNULL(S.[Kommentar Inköpsplanerare], T.[Kommentar Inköpsplanerare]);
Comments