2

ここで、これに答えると思われるいくつかのトピックを見てきましたが、それらは私が探しているものとまったく同じではないようです.

基本的に、特にユーザーテーブルを持つデータベースがあります。これらのまったく同じユーザーが原因で、重複が発生することがよくあります。言い換えれば、1 人が 2 つの別々のアカウントを持っていて、私たちがそれを見つけて 1 つのアカウントに統合し、それがどちらであるかを伝え、2 つ目のアカウントを使用しようとするのをやめるまで、両方を使用します。残念ながら、どのアカウントを維持し、どのアカウントを廃止するかの決定は、必ずしも公式に従うものではなく、むしろ管理者の状況に関する知識に基づいており、どれが維持され、どれが終了するかについて、行ごとに通知されます.

マージの一部には、破棄された ID の出現箇所を保持している ID に置き換えることによって、いくつかのテーブルを変更することが含まれます。この仕事をした最後の人はこれを行うためのスクリプトを持っていましたが、最新のログインがそれらの ID のペアを保持してプルし、mod を作成したものであると単純に想定していました。しかし、私はそれが事実であることに頼ることはできません。実行して処理できるようにしたい ID のペアを含むスプレッドシートがあります。今まで、一つ一つ手作業で行ってきました。

だから、私が探しているのは、次のようなものです。

foreach (x,y) in (oldID1, newID1, oldID2, newID2, ...){
   go through tables and change all instances of x to y;
   }

うまくいけば、それは十分に明確でした。

ありがとう!

4

2 に答える 2

0

このような単純な1回限りのジョブでは、LINQPadを使用して簡単なスクリプトを作成するのが好きです。IDペアに匿名型の配列を使用し、各ペアのスクリプトを実行することができます(SQL Serverを想定)。

var idpairs = new [] {
    new { OldId = 5, NewId = 10 },
    new { OldId = 23, NewId = 45 },
    new { OldId = 443, NewId = 299 }
};

using (var con = new SqlConnection(connectionString)) {
    foreach (var idpair in idpairs) {
        var oldId = idpair.OldId;
        var newId = idpair.NewId;

        // prepare script with old/new id's inserted
        var sql = string.Format("blah blah blah {0} blah blah {1} blah",
            oldId, newId);

        // execute the command
        var cmd = con.CreateCommand();
        cmd.CommandText = sql;
        cmd.ExecuteNonQuery();
    }
}
于 2013-01-16T22:36:19.033 に答える
0

情報が完全に提供されていないので、私はいくつかの仮定をするつもりです。1つの前提条件は、スプレッドシートが上記のフィールド(oldID、newID)に分割されていることです。スプレッドシートをSQLのテーブルにインポートします。

次に、次のコードを使用します(最初はMS SQLの場合)。

DECLARE @oldID int, @newID int
DECLARE CURSOR idCursor STATIC FOR
SELECT oldID,newID FROM idSpreadsheetTable
OPEN idCursor
FETCH NEXT FROM idCursor INTO @oldID,@newID
WHILE (@@FETCH_STATUS = 0)
BEGIN
  UPDATE Table1 SET idField = @newID WHERE idField = @oldID
  ... More update table commands
  FETCH NEXT FROM idCursor INTO @oldID,@newID
END
CLOSE idCursor
DEALLOCATE idCursor

そしてここにmySQL構文があります:

DECLARE done INT DEFAULT FALSE;
DECLARE oldID,newID int;
DECLARE idCursor CURSOR FOR SELECT oldID,newID FROM idSpreadsheetTable
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN idCursor;
read_loop: LOOP
  FETCH idCursor INTO oldID, newID;
  IF done THEN
     LEAVE read_loop;
  END IF;
  UPDATE Table1 SET idField = newID WHERE idField = oldID;
  ... More update table commands
END LOOP;
CLOSE idCursor;
于 2013-01-16T22:47:46.820 に答える