SQLSERVER 自带的数据导入工具有两点不好:
1. 数据库复制,会复制所有表的所有数据,有的大表没有必要导,不好控制
2. 数据导入,当表中有IDENTITY限制时,只能一个一个表去设定取消,导入后再设置回去
今天写了一段SQL,来执行部分表的数据导入
用到了一些知识点:
1. 建立链接服务器
2. 设置IDENTITY列的可插入属性
3. 带参数的游标
建立链接服务器
EXEC sp_addlinkedserver
@server='DBVIP',
@srvproduct='',
@provider='SQLOLEDB',
@datasrc='58.1.2.3'
EXEC sp_addlinkedsrvlogin
'DBVIP',
'false',
NULL,
'sa',
'sapwd'
// 先生成来源数据库的脚本,在目标服务器上建立新的数据库,这是目标数据库
的结构和来源数据库是一样的
// 先建立一个临时表,将包含IDENTITY属性列的表的名称导入导临时表
// 依据COLSTAT=1来判断为IDENTITY列不一定准确,没有查过资料
create table table_tmp (table_name nvarchar(50))
insert into table_temp
select name from sysobjects where id in (
select id from syscolumns
where id in (select id from sysobjects
where type='u') and colstat=1 ) order by name
//定义一个游标,获得所有要导数据的表
declare cur_tab cursor for select table_name from table_tmp
declare @name nvarchar(40)
declare @sql nvarchar(2000)
begin
open cur_tab;
fetch cur_tab into @name;
while(@@fetch_status=0)
begin
// 将表的IDENTITY_INSERT属性设置为ON,准备导入数据
set @sql='set identity_insert '+ @name + ' on;';
print(@sql);
--exec(@sql);
// 这里声明带参数的游标,取得当前表的所有列,因为表具有IDENTITY的列时,
// 必须要将表的列全部写出来啊,才可以导入
exec('
declare cur_col cursor
for select name from syscolumns
where id= (
select id from sysobjects
where type=''u''
and name='''+ @name +''')');
declare @col nvarchar(20);
declare @in_sql nvarchar(2000);
declare @in_col nvarchar(1000);
set @in_col='';
open cur_col ;
fetch cur_col into @col;
while(@@fetch_status=0)
begin
set @in_col=@in_col+@col+',';
fetch cur_col into @col;
end;
set @in_col=substring(@in_col,1,len(@in_col)-1);
set @in_sql='insert into '+@name +' ('+@in_col+') select '+@in_col+ ' from DBVIP.src_db.dbo.'+@name;
print(@in_sql);
--exec(@in_sql);
close cur_col;
deallocate cur_col
set @sql='set identity_insert '+ @name + ' off;';
print(@sql);
--exec(@sql);
fetch cur_tab into @name;
end;
close cur_tab;
deallocate cur_tab
end;