2016-11-26 9 views
1

現時点で問題が発生しており、このための簡単な解決策が必要です。条件の場合に挿入または更新する

この問題に関する別の回答は既に見つかりましたが、何も助けなかったので、私はINSERT INTOとINSERT ON DUPLICATE KEY UPDATEについて読んだことがあります。

既存のテーブルに新しい列を追加すると、移行前のテーブルの既存のレコードが既存の列でも空の値を持つレコードを取得するという問題があります。

私は、インサートまたはアップデートに従って、移行された新しいテーブルを埋めることを目的としているSPを実行しています。

  • は、私は空の列を持つテーブルに既存のレコードを発見した場合を除いて、常に新しいレコードを挿入する(列番号 - 主キー - 満たされている)

「擬似コード」

int i = 0; 
foreach(Record item in importing_data_table) 
{ 

    if(i < tableMigrated.Length && tableMigrated[i].Column IS NULL) 
    { 
      UPDATE tableMigrated[i] SET Column = item.Column 
    } 
    else 
    { 
      INSERT INTO item 
    } 

    i++; 
} 

注:前tableMigratedからすべての行を削除する(SQLテーブルの知識とC#の構文を混合)はこのようなものになるだろうその表への外部キーが存在するため、挿入は可能なではありません。そのアプローチを試す次のエラーがあります。 - DELETEステートメントがREFERENCE制約 "FK_blabla.Testing_testingTest.tableMigrated_Id"と競合しました。

注2:私の唯一のオプションはカーソルを使用しているのでしょうか?

あらかじめご協力いただきありがとうございます。

+1

を見てみましょう。私は今週自分でそれを解決しました。 Updateは、影響を受ける行の数を示す整数を返します。 Updateがゼロを返したら、データを挿入します。プライマリキーの値がすでにデータベースに存在する場合は挿入できません。したがって、最初に更新を試み、影響を受けた行がゼロになった場合はInsertを使用します。 – jdweng

答えて

1

ストアドプロシージャで、マージステートメントを使用します。 Mergeは、挿入条件に基づいてINSERTに機能を提供します。それ以外の場合はUPDATEです。ここでは一例である

MERGE dbo.FactBuyingHabits AS Target 
USING (SELECT CustomerID, ProductID, PurchaseDate FROM dbo.Purchases) AS Source 
ON (Target.ProductID = Source.ProductID AND Target.CustomerID = Source.CustomerID) 
WHEN MATCHED THEN 
    UPDATE SET Target.LastPurchaseDate = Source.PurchaseDate 
WHEN NOT MATCHED BY TARGET THEN 
    INSERT (CustomerID, ProductID, LastPurchaseDate) 
    VALUES (Source.CustomerID, Source.ProductID, Source.PurchaseDate) 

私は誰かがこの質問をするつもりだった知っていたTechnet - Inserting, Updating, and Deleting Data by Using MERGE

+0

あなたの答えをありがとう、私はエラーを取得している、問題を見つけることができない、ときにはSQLは私を狂った神の気がドライブ...ほとんどの時間に表示されるエラーは全く助けにはならない!ここに私の現在のコードは、http://pastebin.com/R0uByLqv – TiagoM

+0

Finnalyはそれを働かせた、私は本当に "ターゲット"をマージステートメント(最初の行)の最後の単語として使用する必要があるようだ、ターゲットデータベースのエイリアス、それは今のようです// – TiagoM

+0

実際に私はテーブルの任意のエイリアスで "ターゲット"という言葉を使うことができますが、私の問題はすべて " MYTABLEALIAS THEN "、MYTABLEALIASをTARGETに変更すると、完璧に動作し始めました。ありがとうございます。 :) – TiagoM

関連する問題