2016-05-03 66 views
0

我試過在本網站上發現的不同解決方案,當它更新或插入使用SQL代碼,我得到更新工作,但不能實現工作插入如果行不存在,在(更新)代碼正在這個樣子的,如何讓它也插入會很高興,因爲我是一個* SQL新手任何幫助,那麼這裏是工作代碼:SQL UPDATE或INSERT

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

將WHERE語句改爲INNER JOIN,看看它是否適用於您 –

回答

3

如果您有SQL Server 2008或更高版本,則可以使用MERGE語句。下面的Microsoft TechNet文章介紹了MERGE語句相當不錯: 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]); 
+0

Worked Perfectly! Thanx十億:) – Nia

+0

但我該如何檢查S. [KommentarInköpsplanerare] = null並防止覆蓋數據庫中的現有值?或者不可能? – Nia

+0

這取決於你想要用NULL值做什麼。例如,如果您只想從源集中排除具有NULL值的記錄,則可以使用查詢在using子句中更新源表。我已經更新了示例以說明如何完成此操作。 Alternativley如果您只是想要忽略特定字段(如果相應的源字段爲空),則可以使用「ISNULL()」函數在源爲空時簡單地返回原始值。 –

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>) 
0

的替代@Edmond昆頓會後刪除匹配的行,並插入:

DELETE TTT 
FROM TTT 
INNER JOIN #tmp_x 
ON TTT.Artikelnummer = #tmp_x.Artikelnummer 

INSERT INTO TTT 
SELECT * FROM #tmp_x 
+0

這是一個壞主意。如果TTT使用外鍵約束連接到表,它可能會引發錯誤或從這些表中刪除記錄(如果刪除級聯設置爲true)。 – ATC

+0

這是正確的,這一切都歸結爲什麼數據用於和依賴。這看起來像是一個分析表格(有些訂單和東西永遠不會投入生產),刪除,插入是最快的選擇。合併是2008+,特別是在有限制時較慢。爲了專業目的,您將創建一個ETL過程。 –