2012-01-24 11 views
3

私は500000個のオブジェクトをデータベースに挿入していますが、その多くは同じです(データベースには同じ主キーの表現があります)が、他のフィールドは異なる可能性があります。問題は、オブジェクトがnull(ファイルから読めない)に設定されたいくつかのフィールドを持っていて、ある値のセットですでにデータベースに入っていることがあるため、nullに更新する=消去するということです。それはヌルではありませんか?ここでオプションのパラメータを指定したSqlアップデートコマンド?

は、私は今それをやっているかの簡単な例です:アップデート

private const string UpdateKun = "UPDATE pde.Kun SET [email protected] WHERE [email protected]"; 
private const string InsertKun = "INSERT INTO pde.Kun ([Licence], [Jmeno], [VykonnostniStupen]) VALUES (@Licence, @Jmeno, @VykonnostniStupen)"; 

var cmd = new SqlCommand(UpdateKun, conn, tran); 
cmd.Parameters.AddWithValue("@Licence", kun.Licence); 
cmd.Parameters.AddWithValue("@Jmeno", kun.Jmeno); 
RepairNulls(cmd.Parameters); 
if (cmd.ExecuteNonQuery() > 0) return; 

cmd = new SqlCommand(InsertKun, conn, tran); 
cmd.Parameters.AddWithValue("@Licence", kun.Licence); 
cmd.Parameters.AddWithValue("@Jmeno", kun.Jmeno); 
cmd.Parameters.AddWithValue("@VykonnostniStupen", 0); 
RepairNulls(cmd.Parameters); 
cmd.ExecuteNonQuery(); 


private void RepairNulls(SqlParameterCollection col) 
    { 
     foreach (SqlParameter param in col.Cast<SqlParameter>().Where(param => param.Value == null)) 
     { 
      param.Value = DBNull.Value; 
     } 
    } 
+0

より大きいかどうかをチェック:そのA以来 'INSERT ... IF DUPLICATEのUPDATE ...' –

+0

@ypercube 'SqlCommand'はSQL Serverです。それは2005年かそれ以上の間、それはマージだ –

+0

ええ、私は本当にSQLにはないが、私はその機能を持っているはずだと思います:)私は、SQL Server 2008 Express Editionを使用して、私はマージシンタックスを検索します – MSkuta

答えて

2

変更するには:

UPDATE pde.Kun 
SET Jmeno = COALESCE(@Jmeno, Jmeno) 
    , ColumnB = COALESCE(@ColumnB, ColumnB) 
WHERE [email protected] 

UPDATE pde.Kun 
SET [email protected] 
WHERE [email protected] 
    AND @Jmeno IS NOT NULL 

あなたは更新するために、複数の列を持っている場合

+0

良いアイデア私はちょうどオブジェクトの例だったのですが、通常は私が挿入しているオブジェクトは20個のフィールドを持っていて、すべてがデータベース内でnullになる可能性があります。 – MSkuta

+0

'COALESCE()'関数を使うことはパフォーマンス上の問題ではないと思います。 500Kの行を挿入するために500Kの更新と500Kの挿入を使用するかもしれません。 –

+0

あなたのDBMS(SQLサーバとは何ですか?)に応じて、行を挿入/更新する方が良いでしょう。 –

0

行が存在するかどうかを確認するためにデータベースを更新しないでください。

SELECT COUNT(*) FROM pde.Kun WHERE [email protected] 

とだけ返された値を使用すると、1つの文で説明するようにいくつかのSQL製品が機能を持っている0

+0

を使用していますか、または存在する場合EXISTS –

+0

行を挿入する必要がある状況で、行が既に終了していて、それを更新している場合は、SQLの1つの呼び出しを保存します任意の行が挿入されています。これは最大2回の呼び出しです(通常は1回ありますので、私のケースでは繰り返し回数が増えます)。もしselect countを使用していれば、2回呼び出し存在する場合は、 – MSkuta

+0

を更新または挿入しますが、同じデータを持つ行は更新しません。 select文は、テーブルのインデックスを使用してその行が存在するかどうかを調べるため、パフォーマンスが大幅に向上します。 [同様の質問はこちら](http://stackoverflow.com/questions/6696063/select-vs-update-performance-with-index) – Kypros

関連する問題