将表从一个数据库复制到SQL Server中的另一个数据库


324

我有一个名为foo的数据库和一个名为bar的数据库。我在foo中有一个名为tblFoobar的表,我想将(数据和所有)表从数据库foo移动到数据库栏。要执行此操作的SQL语句是什么?

Answers:


208

在SQL Server上?在同一数据库服务器上?使用三部分命名。

INSERT INTO bar..tblFoobar( *fieldlist* )
SELECT *fieldlist* FROM foo..tblFoobar

这只是移动数据。如果要移动表定义(以及其他属性,例如权限和索引),则必须执行其他操作。


我认为,您还必须单独设置表权限。
Ken Ray

1
如果您也需要进行身份插入,则数据导入向导可以为该^^提供一个选项-引用其他答案
Clarence Liu

13
@TahaRehmanSiddiqui:因为它回答了问题;)他没有询问如何在数据库服务器之间复制它。但是,大多数人都在寻找该答案,因为Google给出了第一个结果:)
Maarten Kieft 2014年

1
@RyanB是的,这是允许的。
艾米B

1
@Tom OP和许多遇到此问题的人正在寻找“ SQL语句”而不是工具。
艾米B

535

SQL Server Management Studio的“导入数据”任务(右键单击数据库名称,然后单击任务)将为您完成大部分任务。从您要将数据复制到的数据库中运行它。

如果这些表不存在,它将为您创建它们,但是您可能必须重新创建任何索引等。如果这些表确实存在,则默认情况下它将添加新数据,但是您可以对其进行调整(编辑映射),以便删除所有现有数据。

我一直在使用它,并且效果很好。


1
我似乎找不到此选项。这里有特定的版本吗?
Nerrve

35
您通常不能说这是一个更好的答案。例如,无法从脚本中调用自动化。顺便说一句,作者专门要求一个“ ..SQL语句..”。但这当然是一个很好的答案,但不是更好的答案;)。
灰熊2012年

3
作者要求移动“(数据和全部)”;所以我希望这个答案能做到。它创建表,但不创建任何键或索引。因此,对SQL答案的改进不多。
unubar 2014年

是否可以WHERE使用“导入数据”任务指定条件?我无法找到一种方法。
暗恋

1
是的,这是因为提到正确的方法在这里过,但identityforeign key引用在目标数据库中删除,任何解决方案?
shaijut

106

这应该工作:

SELECT * 
INTO DestinationDB..MyDestinationTable 
FROM SourceDB..MySourceTable 

不会复制内容,默认值或索引。创建的表将没有聚集索引。

或者,您可以:

INSERT INTO DestinationDB..MyDestinationTable 
SELECT * FROM SourceDB..MySourceTable

如果目标表存在并且为空。


如果您首先复制基表结构(字段和数据),然后应用一个 修补程序脚本来创建权限,索引,约束和扩展属性,?
leoinfo

4
这不会在SQL Server 2008中为标识列插入值。仅当您使用列列表并且目标表IDENTITY_INSERT为ON时才允许这样做。
卢卡斯·威尔逊·里希特

@Lucas-您是“一半”对:)。但是,第一个SQL语句将复制所有数据,包括标识列中的值。就像我说的,约束没有创建。但是,一旦所有数据被移动,它们就可以轻松地在源DB上编写脚本,并应用于目标DB。
leoinfo

第二个版本(INSERT INTO...)在Oracle中对我有用。
vapcguy

如果2个数据库位于具有不同连接字符串的完全不同的服务器上,这是否可行?如果没有,您将如何处理?
亚历山大·瑞安·巴格特

46

如果只有一张桌子,那么您要做的就是

  • 脚本表定义
  • 在另一个数据库中创建新表
  • 更新规则,索引,权限等
  • 导入数据(上面已经显示了几个示例)

您必须考虑的一件事是其他更新,例如将来迁移其他对象。请注意,您的源表和目标表名称不同。这意味着,如果您依赖于对象(例如视图,存储过程等),则还必须进行更改。

如果不需任何问题,您就可以手动去掉一个或几个对象。但是,当更新不只几个时,第三方比较工具会非常方便。现在,我正在使用ApexSQL Diff进行模式迁移,但是使用其他任何工具都不会出错。


23
  1. 脚本的create table管理工作室,运行该脚本在酒吧创建表。(在对象资源管理器中右键单击表,将脚本表另存为,创建为...)

  2. INSERT bar.[schema].table SELECT * FROM foo.[schema].table


1
我喜欢这种方法。如果存在标识列,则选择*将不起作用,您需要显式列出列名称。SET IDENTITY_INSERT TblName ON在这种情况下,您还需要这样做。
JeremyWeir 2012年

16

您还可以使用“ 生成SQL Server脚本向导”来帮助指导创建SQL脚本,该脚本可以执行以下操作:

  • 复制表架构
  • 任何约束(身份,默认值等)
  • 表中的数据
  • 和许多其他选项(如果需要)

SQL Server 2008很好的示例工作流,此处显示了屏幕截图。


见上面我的意见:?!?“这是怎么获得一百七十一分之五百零八投票和瑞安的‘10月11日'11在23:41’答案只得到13日期瑞安的是只能回答这个问题的答案是运算的Q值。完全因为它处理以下情况(顺便说一句,OP并没有排除他的问题):a)身份(非常常见),b)约束,c)触发器,d)索引,e)权限,d)复制架构和数据(提示:op的“(数据和所有)”的“和所有”部分也暗示着模式。)和e)生成“ SQL语句”,由op指定,即使他不是从字面上看,也最好这么做比没有。”。
汤姆(Tom)

1
注意:仅当行数不是“过多”(即查找/小事务表)并且没有“大”列值时,此答案才是实际的。对于这些,我将仅使用Ryan的答案为表(包括列属性和子对象)创建生成脚本,然后使用David B的“插入选择”答案。对于单个表(而不是Ryan的A),还可以使用SSMS,对象资源管理器,右键单击表,脚本表为,创建位置,但是必须首先确保工具,选项,SQL Server对象资源管理器,脚本选项为根据需要设置。
汤姆

9

您可以采用这种方式:(一个一般示例)

insert into QualityAssuranceDB.dbo.Customers (columnA, ColumnB)
Select columnA, columnB from DeveloperDB.dbo.Customers

另外,如果您还需要生成列名以放入insert子句,请使用:

    select (name + ',') as TableColumns from sys.columns 
where object_id = object_id('YourTableName')

复制结果并粘贴到查询窗口中,以代表您的表列名称,甚至这也将排除标识列:

    select (name + ',') as TableColumns from sys.columns 
where object_id = object_id('YourTableName') and is_identity = 0

请记住,如果数据库属于同一位置,则复制行的脚本将起作用。


您可以尝试一下。

select * into <Destination_table> from <Servername>.<DatabaseName>.dbo.<sourceTable>

如果两个数据库都在同一服务器中,则服务器名称是可选的。


1

如果存在现有表,并且我们只想复制数据,则可以尝试此查询。

插入Destination_Existing_Tbl中,然后从Source_Tbl中选择col1,col2


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.