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;



posted on 2008-05-06 16:59  白沙河  阅读(801)  评论(1编辑  收藏  举报