我已经看过这里我想回答的几个主题,但它们似乎并不是我想要的。
基本上,我有一个数据库,除其他外,还有一个用户表。由于这些用户非常相同,我们通常会重复使用。换句话说,一个人有两个独立的帐户并使用它们,直到我们赶上并将它们合并到一个帐户中,告诉它们是哪个帐户并停止尝试使用第二个帐户。不幸的是,决定使用哪个账户以及使用哪个账户并不总是遵循一个公式,而是管理员对情况的了解,并且我会逐行了解并保持不变。
合并的一部分涉及通过用我们保留的ID替换任何出现的丢弃ID来修改多个表。最后一个有这个职位的人有一个脚本可以做到这一点,但它只是假设最近的登录是保留和拉出这些ID并制作mod的那个。但是,我不能依赖于这种情况。我有一个带有成对ID的电子表格,我希望能够运行并处理这些ID。直到现在,我一直在手工做这一切,一次一个。
所以,我正在寻找的是:
foreach (x,y) in (oldID1, newID1, oldID2, newID2, ...){
go through tables and change all instances of x to y;
}
希望这很清楚。
谢谢!
答案 0 :(得分: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();
}
}
答案 1 :(得分: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;