zoukankan      html  css  js  c++  java
  • SQLSERVER 导入带IDENTITY属性的数据

    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;



  • 相关阅读:
    史上最全常用正则表达式大全
    JAVA中不要用e.printStackTrace()
    JAVA中不要用e.printStackTrace()
    为什么尽量不用e.printStackTrace
    java返回集合为null还是空集合以及空集合的三种写法
    IntelliJ IDEA使用技巧——常用快捷键Mac篇
    [php] 使用laravel-modules模块化开发
    [php] 解决laravel: production.ERROR: No application encryption key has been specified
    [gitlab] 解决:remote: Ask a project Owner or Maintainer to create a default branch:
    [composer] composer 安装配置laravel 8
  • 原文地址:https://www.cnblogs.com/baishahe/p/1185424.html
Copyright © 2011-2022 走看看