tsi*_*ilb 11 c# sql t-sql migration bulkinsert
所以我有一个旧的数据库,我正在迁移到一个新的数据库.新的架构略有不同但大部分兼容.另外,我想从零重新编号所有表.
目前我一直在使用我编写的工具,手动检索旧记录,将其插入新数据库,并更新旧数据库中的v2 ID字段,以在新数据库中显示其对应的ID位置.
例如,我从MV5.Posts中选择并插入MV6.Posts.插入后,我在MV6.Posts中检索新行的ID,并在旧的MV5.Posts.MV6ID字段中更新它.
有没有办法通过INSERT INTO SELECT FROM执行此UPDATE所以我不必手动处理每个记录?我正在使用SQL Server 2005,dev版.
HLG*_*GEM 10
迁移的关键是做几件事:首先,没有当前备份就不要做任何事情.其次,如果密钥将发生变化,则需要至少暂时将新旧结构存储在新结构中(永久性地,如果密钥字段向用户公开,因为他们可能正在搜索以获取旧记录).
接下来,您需要彻底了解子表的关系.如果更改关键字段,则所有相关表也必须更改.这是存储旧密钥和新密钥的地方.如果您忘记更改其中任何一项,则数据将不再正确且无用.所以这是关键的一步.
选择一些特别复杂数据的测试用例,确保为每个相关表包含一个或多个测试用例.将现有值存储在工作表中.
要开始迁移,请使用旧表中的select插入新表.根据记录的数量,您可能希望循环批处理(一次不是一个记录)以提高性能.如果新密钥是标识,则只需将旧密钥的值放在其字段中,然后让数据库创建新密钥.
然后对相关表格执行相同操作.然后使用表中的旧键值来更新外键字段,例如:
Update t2
set fkfield = newkey
from table2 t2
join table1 t1 on t1.oldkey = t2.fkfield
Run Code Online (Sandbox Code Playgroud)
通过运行测试用例并将数据与迁移前存储的数据进行比较来测试迁移.彻底测试迁移数据至关重要,或者您无法确定数据是否与旧结构一致.迁移是一项非常复杂的行动; 花时间去做非常有条不紊和彻底的工作是值得的.
可能最简单的方法是在oldId的MV6.Posts上添加一列,然后将旧表中的所有记录插入到新表中.最后,使用类似的内容更新新表中oldId上匹配的旧表:
UPDATE mv5.posts
SET newid = n.id
FROM mv5.posts o, mv6.posts n
WHERE o.id = n.oldid
Run Code Online (Sandbox Code Playgroud)
如果你愿意,你可以随后清理并删除oldId列.