在SQL Server中的数据库之间复制行

Ade*_*ele 14 sql sql-server

将大量行从一个数据库中的表复制到另一个具有完全相同结构的数据库中的表的最有效方法是什么?

Chr*_*s J 18

如果数据库位于同一台服务器上,那么它是微不足道的 - 您就像在同一数据库中的表之间进行复制一样,即:

INSERT INTO targetdatabase..targettable (col1, col2, col3, col4)
    SELECT col1, col2, col3, col4 FROM sourcedatabase..sourcetable
Run Code Online (Sandbox Code Playgroud)

如果数据库位于不同的服务器上,您需要查看使用OPENQUERY,OPENROWSET或链接服务器之一来进行查询,但从根本上说,即使是所有这些,您仍然会在上面的命令中编写变体.

或者,这是一个BCP输出和BCP或使用SQL Server Management Studio的数据传输向导的情况.

  • 对于像我这样的其他新手来说:是的,故意使用双点(`sourcedatabase..sourcetable`)。如果只放一个,那是行不通的。 (2认同)

Rem*_*anu 15

如果您的日志IO子系统允许它,那么:

INSERT INTO target(field1, field2, field3)
SELECT field1, field2, field3 FROM source;
Run Code Online (Sandbox Code Playgroud)

但是,在一个语句中进行整个传输意味着单个事务,这意味着必须在整个语句中生成并保留 x2.5数据大小日志.IE浏览器.如果传输50Gb,目标数据库日志将增长到250Gb(即使恢复模式设置为简单!).

如果您担心日志,那么您必须批量转移.您仍然可以执行INSERT ... SELECT技巧,但您的SELECT必须使用一些键范围和批次可接受的行数.

最终,你总是可以做一个bcp out接着一个bcp in,它的工作非常快,可能是得到一个可靠的传输会以最快的方式.


Jus*_*ing 6

一个简单的方法是打开 SSMS 并右键单击数据库,然后转到任务 > 导入数据,然后按照向导设置源和目标。

这样,如果数据存在于不同的系统上,即使您希望更改结构,也可以这样做。

同时从目的地追加或清除数据。


Nou*_*tti 6

Insert into targetdatabase.dbo.tablename
select * from sourcedatabase.dbo.tablename
Run Code Online (Sandbox Code Playgroud)

注意: .dbo很重要

如果源表和目标表中的列不同,则显式提及两个表的列。请记住,数据类型应该相同

  • :)我提到过,如果您的栏目在来源和目标上与您需要提及的栏目有所不同,否则它将起作用 (3认同)