SqlServer数据库表的数据迁移
这是前两天做的⼀个项⽬,主要功能就是把表A的数据,迁移到表B和表C,然后删除掉表A的数据。
限制就是,在表A中没有任何的标识列可以证明了该表的某⾏数据被操作过,并且,还在往表A中不停的插⼊数据。如果直接使⽤
insert into B(列1,列2,,,)  select 列1,列2,,, from A
insert into C(列1,列2,,,)  select 列1,列2,,, from Asqlserver备份表语句
delete from A
这样的语句进⾏插⼊时,在数据量⼩的时候,观察不出问题,但是使⽤脚本向表A中不停的插⼊数据量⼏⼗万的时候,就可以发现有数据丢失的问题。
进⾏修改,把抓取所有,改为抓取固定条数,来解决数据丢失的问题,如下:
insert into B (列1,列2,,,) select top 2000 列1,列2,,, from A
insert into C (列1,列2,,,) select top 2000 列1,列2,,, from A
delete from A WHERE EXISTS (SELECT '1' FROM B WHERE A.列1=B.列1);
在测试时发现,仍然有概率出现数据丢失的问题。猜测原因:A表在不停的插⼊数据中,执⾏插⼊语句1和插⼊语句2时,select top 2000的值可能存在差异,从⽽造成数据不⼀致的情况。
原因只是猜测,还需要进⼀步的验证,解决的⽅案就是将select top 2000放在⼀个临时表中,然后通过这临时表进⾏插⼊和删除的操作,如下:
create table #TMP(列1 类型1,列2 类型2,,,)
insert into #TMP(列1 类型1,列2 类型2,,,) select top 2000 列1,列2,,, from A with(nolock)
insert into B(列1,列2,,,) select 列1,列2,,, from #TMP with(nolock)
insert into C(列1,列2,,,) select 列1,列2,,, from #TMP with(nolock)
delete from A WHERE EXISTS (SELECT '1' FROM #TMP with(nolock) WHERE A.列1=#TMP.列1);
通过⼀个临时表来存放数据后,在通过脚本向表A中插⼊百万级的数据量的同时,执⾏数据的迁移操作⽆数据丢失的情况发⽣,数据得到了正常迁移。
注:以上的SQL为存储过程,程序通过调⽤存储过程来执⾏数据迁移操作

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。