【问题标题】:Select into statement where source is other databaseSelect into 语句,其中源是其他数据库
【发布时间】:2011-11-25 03:10:09
【问题描述】:

如何将数据从一个数据库复制到另一个具有相同表结构的数据库中并保留密钥标识?

我使用 Sql Server 2012 “Denali”,我想从 Sql Server 2008 数据库中复制一些数据。我拥有的表完全相同,但我希望将旧数据库中的数据放入新的“Denali”数据库中。数据库位于不同的服务器上。

所以我想要类似的东西

USE newDB;
GO
SELECT *
INTO newTable
FROM OldDb.oldTable WITH (KEEPIDENTITY);
GO

有人建议让这个可行吗?

【问题讨论】:

    标签: sql sql-server sql-server-2008 sql-server-2012 sqlbulkcopy


    【解决方案1】:

    今天遇到了这个问题,但它不起作用:(如果两个数据库都在同一台服务器上,您必须使用数据库的完全限定名称。不要忘记 .dbo 架构。。 p>

    Select  *
    INTO [NEW DB].dbo.Lab_Tests
    from [OLD DB].dbo.Lab_Tests
    

    【讨论】:

      【解决方案2】:

      配置链接服务器并在查询中引用它。您可能还需要使用IDENTITY_INSERT

      SSMS 中内置的 SSIS 组件还可以从不同来源(XML、平面文件或本地/远程服务器)加载数据。

      【讨论】:

        【解决方案3】:

        如果你的两个数据库都在同一台服务器上,那么你可以这样做:

        insert into newTable
        select col1,col2  from OldDB.dbo.OldTable
        

        【讨论】:

        • 不幸的是他们在不同的服务器上。
        • 那么您需要尝试导入/导出功能,但请确保您需要先禁用所有约束,然后导入数据,然后启用所有约束。
        【解决方案4】:

        将数据库从一台服务器复制到另一台服务器(远程)时有一定的限制。

        因此,您必须按照步骤将数据库从一台服务器完全转移到另一台具有相同身份和约束的服务器。

        1. 简而言之,生成数据库脚本,即右键单击数据库 > 任务 > 生成脚本 > 选择数据库 > 将这些标记为真:触发器、索引、主键和外键以及其他(如果有)。 > 选择对象类型:将除用户之外的所有标记都标记为真(您可以稍后在新服务器上手动创建用户)。 > 选择所有表、SP 和其他对象 > 脚本到新窗口或文件(如你所愿) > 完成。

        2. 生成脚本以“创建数据库”并在服务器上运行。

        3. 在新服务器上运行步骤 1. 脚本,检查查询窗口中是否选择了新数据库。

        4. 禁用新服务器上的所有约束 > EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

        5. 我认为使用向导速度很快,所以使用旧数据库服务器中的数据库导出向导将数据从旧数据库服务器传输到新数据库服务器。

        6. 再次,启用新服务器上的所有约束 > EXEC sp_msforeachtable @command1="print '?'", @command2="ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"

        PS:版本无关紧要,如果你的情况是SQL Server 2008,你必须转移数据库假设是当前版本,复制数据库后你可以更改数据库的版本。

        数据库属性>选择一个页面:“选项”>兼容级别>从下拉列表中选择版本。

        【讨论】:

          【解决方案5】:

          如果您想在IDENTITY 字段中插入显式值,则可以使用SET IDENTITY_INSERT table OFF

          CREATE TABLE dbo.Destination
          (
              Id INT IDENTITY(1,1) PRIMARY KEY
              ,Name NVARCHAR(100) NOT NULL
          );
          
          INSERT  dbo.Destination
          VALUES  ('A'), ('B'), ('C');
          GO
          
          SET IDENTITY_INSERT dbo.Destination ON;
          
          INSERT  dbo.Destination(Id, Name)
          SELECT  T.Id, T.Name
          FROM    (VALUES (10,'D'), (11,'E')) AS T(Id, Name); --or SourceDB.Schema.SourceTable
          
          SET IDENTITY_INSERT dbo.Destination OFF;
          GO
          
          INSERT  dbo.Destination
          VALUES  ('????????');
          GO
          
          SELECT  *
          FROM    dbo.Destination
          
          DROP TABLE Destination;
          

          【讨论】:

            【解决方案6】:

            假设您现在位于旧数据库实例中。
            你可以做的是:

            Select * 
            Into denali.dbo.newTable 
            FROM oldTable
            

            这就像将 oldTable(结构和内容)复制到 newTable 并将其导出到另一个数据库。

            【讨论】:

              猜你喜欢
              • 2010-11-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-01-22
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-11-12
              相关资源
              最近更新 更多