2

我在这里查看了几个我认为可以回答这个问题的主题,但它们似乎并不是我想要的。

基本上,我有一个数据库,除其他外,还有一个用户表。由于那些相同的用户,我们经常会出现重复。换句话说,一个人有两个独立的帐户并使用它们,直到我们发现并将它们合并到一个帐户中,告诉他们这是哪个帐户并停止尝试使用第二个帐户。不幸的是,决定保留哪个帐户以及砍掉哪个帐户并不总是遵循公式,而是管理员对情况的了解,我会逐行了解哪些保留和离开。

合并的一部分涉及通过将任何出现的丢弃 ID 替换为我们保留的 ID 来修改多个表。最后一个完成这项工作的人有一个脚本来执行此操作,但它只是假设最近的登录是要保留的,然后拉出这对 ID 并制作了模组。但是,我不能依赖这种情况。我有一个电子表格,其中包含我希望能够运行和处理的 ID 对。直到现在,我一直都是手工完成,一次一个。

所以,我正在寻找的效果是:

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

希望这已经足够清楚了。

谢谢!

4

2 回答 2

0

对于像这样简单的一次性工作,我喜欢使用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

由于信息未完全提供,我将做出一些假设。一种假设是电子表格被分成上述字段(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 回答