【问题标题】:How do you copy Sql table from one database to another database with differ field names如何将Sql表从一个数据库复制到另一个具有不同字段名称的数据库
【发布时间】:2014-02-20 00:56:30
【问题描述】:

我有一个数据库名“EmpOld”和一个表名“Employee”和一个数据库名“EmpNew”和一个表名“Employee”。

两个数据库表的表结构相同,只是表中的名称不同。

这是表格的定义:

数据库“EmpOld”表名“Employee”有以下字段名:

int       e_id 
char(20)  e_fname 
char(25)  e_lname

数据库“EmpNew”表“Employee”具有以下字段名称:

int       id 
char(20)  fname 
char(25)  lname

注意,表中唯一的区别是字段名称的“e_”前缀已从 EmpNew Employee 表中删除。

如何将数据从EmpOld 数据库移动到EmpNew 数据库?

是否有代码分别映射这些字段。

感谢社区,

尼克

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    嗯,你可以手动命名它们:

    INSERT dbo.EmpNew(fname, lname) SELECT e_fname, e_lname FROM dbo.EmpOld;
    

    如果您想在不手动输入列名的情况下执行此操作,那么 SSMS 有神奇的功能 - 只需将 Columns 文件夹从每个表拖到查询窗口中的适当位置(然后手动删除标识列、时间戳, 计算列等(如果相关)。

    【讨论】:

    • 我想上面的语句会起作用。很抱歉询问以下问题(我的所有 dba 都剩下了,所以我不是一个大 sql 人),但是有没有办法创建字段列表并将其插入到上面的插入语句中。我的表实际上有 100 个字段名。例如,我可以执行 INSERT dbo.EmpNew( pre-generated fieldlist name) Select newfieldlistnames FROM dbo.EmpOld.
    • 在对象资源管理器中,将Columns 文件夹拖到您的查询窗口中。让懒惰再次变得凉爽。 See a visualization here.
    • 太棒了。我很感激帮助。再次感谢。
    【解决方案2】:

    没有自动映射字段的方法,除非有一些代码。

    这可以通过两种方式完成:

    1. 使用 SQL 导入和导出向导

      这是执行此操作的最简单方法,here is an article 提供了逐步执行此操作的步骤。关键是在导入数据时更改源字段和目标字段之间的映射。

    2. 编写 SQL

      此方法要求两个数据库都可以访问。使用如下简单的插入语句就可以实现这一点

      insert into EmpNew.dbo.Employee(id, fname, lname)
      select 
         e_id, e_fname, e_lname
      from
         EmpOld.dbo.Employee
      

      如果它们在同一个 sql server 上,那么上面的内容就可以正常工作。如果它们是不同的 sql server,您可能需要添加一个链接服务器连接并在表命令前加上前缀。

    【讨论】:

    • 谢谢。我会研究你很棒的解决方案。顺便说一句,关于如何以编程方式删除字段名称中的前缀“e_”的任何想法?我的两个数据库表都是相同的。我需要删除数据库“EmpNew”员工表上所有字段上的前缀“e_”。有什么疯狂的代码吗?再次感谢您的所有帮助
    【解决方案3】:

    有没有分别映射这些字段的代码。

    否 - 您需要提供映射。如果您使用的是像 SSIS 这样的 ETL 工具,可能可以根据某些条件以编程方式映射列,但 SQL 中没有内置任何内容。

    【讨论】:

      【解决方案4】:

      也许您可以在表sys.columns 和其他系统表的帮助下生成代码,以便您可以使复制过程自动运行。

      我认为你不能使用:

      insert into (...) (...)
      

      因为你有两个数据库。所以只需生成插入语句,如:

      insert into table (...) VALUES (...)
      

      如果我误解了这个问题,请纠正我。

      【讨论】:

      • 听起来差不多。 sys.columns 似乎是一个有趣的想法。我会研究一下。谢谢
      【解决方案5】:

      有两种方法可以避免数据丢失。 1)您可以使用插入语句

        `
          Insert into EmpNew (ID,fname,lname)
              Select e_id, e_fname, e_lastname 
                  from EmpOld
        `
      

      2) 您可以简单地使用导入导出向导 转到开始菜单 > SQL Server 2008/2008R2/2012 > ImportandExport> 这将带您进入向导框

      • 选择源:- DataSource(ServerName) 和您所在的数据库 从中提取数据
        • 选择目标:DataSource(ServerName) 和您要将数据提取到的数据库
        • 映射表
        • 注意 PK/FK/身份

      你很高兴

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-11-29
        • 1970-01-01
        • 1970-01-01
        • 2016-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多