SQL UPDATE或INSERT

时间:2016-05-03 12:04:40

标签: sql sql-server insert

我尝试过在使用SQL代码更新或插入时在本网站上找到的不同解决方案,我得到了更新,但如果行不存在则无法实现工作插入,工作的(更新)代码看起来像这样,任何有关如何使其插入的帮助也会很好,因为我是一个* SQL新手,这里是工作代码:

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';

3 个答案:

答案 0 :(得分:3)

如果您有SQL Server 2008或更高版本,则可以使用MERGE语句。以下Microsoft TechNet文章很好地描述了合并语句: https://technet.microsoft.com/en-us/library/bb522522(v=sql.105).aspx

您的查询应如下所示:

    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]);

答案 1 :(得分:1)

在Sql server中,您可以在同一语句中执行插入和更新,称为MERGE

MERGE TTT AS target
USING #tmp_x AS source 
ON (target.Artikelnummer = source.Artikelnummer )
WHEN MATCHED THEN 
    UPDATE SET [Artikelbenämning] = source.[Artikelbenämning],
               [Count of Ordernummer] = source.[Count of Ordernummer],
               [Sum of Antal beställda] = source.[Sum of Antal beställda]....
WHEN NOT MATCHED THEN
INSERT (<target's columns list>) -- I got a little lazy here...
VALUES (<source's columns list>)

答案 2 :(得分:0)

@Edmond Quinton的替代方案是删除匹配的行并插入:

{
name:"room A",
bookings: [
  {start:"10:00 AM", end:"12:00 AM", user:"Ram Sen"},
  {start:"08:00 AM", end:"09:00 AM", user:"Sam Roy"},
  {start:"01:00 PM", end:"3:00 PM", user:"Jadu Dey"}
]
}