2016-05-03 17 views
0

SQLコードを使用して更新または挿入するときに、このサイトで見つかったさまざまなソリューションを試しましたが、更新は機能していますが、行が存在しない場合は、このようなルックスを働いている(更新)コード、私はここにも、* SQL初心者ですので、それはまた、挿入にする方法上の任意のヘルプはいいだろう作業コードです:SQL Serverでは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! 10億を増やしています:) – Nia

+0

しかし、私がS [KommentarInköpsplanerare] = nullをチェックしてデータベースの既存の値を上書きしないようにするにはどうすればよいですか?それとも不可能なのでしょうか? – Nia

+0

これは、NULL値で何をしたいかによって異なります。例ソースセットからNULL値を持つレコードを単純に除外したい場合は、using句のソーステーブルをクエリで更新できます。私はこれがどのように行われるかを示すために例を更新しました。 Alternativley対応するソースフィールドがヌルの場合、特定のフィールドを無視したい場合は、ソースがnullの場合は単に "ISNULL()"関数を使用して元の値を返すことができます。 –

1

同じ文で挿入と更新の両方を行うことができます。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プロセスを作成します。 –

関連する問題