从一个SQL Server导出表数据到另一个SQL Server

98

我有两个SQL Server(均为2005版本)。

我想将一些表从一个服务器迁移到另一个服务器。

我尝试了以下操作:

  • 在源服务器上,我右键单击数据库,选择 任务/生成脚本。 问题是,在 表/视图选项 下没有 脚本数据 选项。

  • 然后我使用 脚本表格为/创建脚本 生成SQL文件,以便在目标服务器上创建表。但是我仍然需要所有的数据。

接下来我尝试使用:

SELECT * 
INTO [destination server].[destination database].[dbo].[destination table] 
FROM [source server].[source database].[dbo].[source table]

但是我得到了这个错误:

对象包含超过最大前缀数。最大值为2。

请有人指导我如何解决这个问题?


1
你能展示一下你生成的语句吗?你已经将其他服务器添加为联接服务器了吗? - Preet Sangha
不作为链接服务器。这没有意义,因为两者都是mssql2005。我只是创建了连接。它必须是链接服务器吗? - no9
"Into"语句(用于创建表并将数据插入其中)仅支持本地表。您必须先创建表,然后使用“insert into [目标服务器] .[目标数据库] .[dbo] .[目标表]”。 - jumxozizi
简单的方法是备份(包括数据)然后在目标数据库中进行恢复。 - Naga
我遇到了像服务器不可用/未连接之类的错误。然后我使用以下命令,然后它就正常工作了。USE master; GO EXEC sp_addlinkedserver
N'servername',
N'SQL Server'; GO
- karthik G
12个回答

84

尝试这样做:

  1. 使用来自“Script Table As/Create Script”步骤的脚本,在目标服务器上创建您的表。

  2. 在目标服务器上,您可以发出 T-SQL 语句:

  3. INSERT INTO dbo.YourTableNameHere
       SELECT *
       FROM [SourceServer].[SourceDatabase].dbo.YourTableNameHere
    
    这应该可以正常工作。

3
我喜欢你的提议。我尝试了一下,但出现了问题:“在sys.servers中找不到服务器''”。请确认已指定正确的服务器名称...也许问题在于源服务器名称是以“NAME\NAME2”格式?但我认为用[]应该可以解决这个问题...你觉得呢? - no9
27
抱歉——为了让这个工作正常,你需要在你的两个服务器之间添加一个“链接服务器” - marc_s
1
是的。但是请想象一下,我在创建链接服务器时遇到了问题。生产服务器已设置为允许远程连接,但即使使用模拟或直接使用usr/pwd,我仍然遇到超时问题。由于服务器管理不在我的域中,我无能为力。但我设法用另一种方式解决了我的问题。将发布一个答案只是为了好玩,并接受您的解决方案,因为我喜欢它。 - no9

74

这里还有一种SQL Server 2008及以上版本的备份方式:

  1. 右键单击数据库 -> 选择 '任务' -> 选择 '生成脚本'
  2. 选择想要复制的特定数据库对象。比如一个或多个表。点击下一步
  3. 点击高级选项并向下滚动到“要编写的数据类型”选项,选择“模式和数据”。 点击确定
  4. 选择生成脚本的保存位置,然后点击下一步进行操作

2
这个选项在Microsoft SQL Management Studio版本9(附带SQL Server 2005)中不可用,这很可能是OP所指的版本。 - Marcel
3
好的解决方案,但是在处理大表格时开始出现问题。 - Duane

17
如果您没有链接服务器的权限,以下是使用SQL Server导入/导出向导从一个服务器复制表到另一个服务器的步骤:
  • 右键单击要复制的源数据库。
  • 选择任务 - 导出数据。
  • 在数据源中选择 Sql Server Native Client。
  • 选择您的身份验证类型(Sql Server或Windows身份验证)。
  • 选择源数据库。
  • 接下来,选择目标:Sql Server Native Client
  • 输入服务器名称(您要将表复制到的服务器)。
  • 选择您的身份验证类型(Sql Server或Windows身份验证)。
  • 选择目标数据库。
  • 选择复制数据。
  • 从列表中选择您的表。
  • 点击下一步,选择立即运行,或者可以选择将包保存到文件或Sql Server以便以后运行。
  • 完成

2
对我来说,这最终证明是最简单的方法。尽管SSMS在打开向导时速度较慢! - Shahryar Saljoughi
但是主键和外键关系没有被复制到新数据库。 - StarLord

12

在“任务/生成脚本”中有脚本表选项!一开始我也错过了它!但是你可以在那里生成插入脚本(非常好的功能,但位置不太直观)。

当你到达“设置脚本选项”的步骤时,请转到“高级”选项卡。

这里描述的步骤在这里(图片可以理解,但我用拉脱维亚语写)。


10

尝试使用SQL Server 导入和导出向导(在任务 -> 导出数据下)。

它提供在目标数据库中创建表的选项。而如您所见,脚本向导只能创建表结构。


我想要从数据库中导出表格,但是没有导出数据的选项。只有:分离、收缩、备份、还原、生成脚本... - no9
脚本向导也可以导出数据。 - user763539
@user763539 - 真的吗?上次我检查时,没有选项可以生成包括例如INSERT语句的脚本;对于[标签:sql-server-2005]肯定是如此。你有链接或参考资料吗? - Damien_The_Unbeliever
到目前为止,这是我最好的解决方案! - Shai Alon
@Damien_The_Unbeliever,为什么你坚持使用脚本生成?那不是问题的关键... - Shai Alon

7
如果表已经使用脚本创建,则另一种复制数据的方法是使用BCP命令将所有数据从源服务器复制到目标服务器。 将表数据导出到源服务器上的文本文件中:
bcp <database name>.<schema name>.<table name> OUT C:\FILE.TXT -c -t -T -S <server_name[ \instance_name]> -U <username> -P <Password> 

从目标服务器上的文本文件导入表格数据:

bcp <database name>.<schema name>.<table name> IN C:\FILE.TXT -c -t -T -S <server_name[ \instance_name]> -U <username> -P <Password>

1
我以前看过这个,但由于我是从生产服务器导出的,所以我不确定是否安全 :) - no9
1
你没有修改你的表格,所以它是绝对安全的,但要记得正确使用IN或OUT语句。使用IN从文本文件获取数据到表格中,使用OUT从表格中获取数据到文本文件(或CSV文件)中。 - praveen
1
使用“-T”进行可信连接或使用“-U <用户名> -P <密码>”进行SQL登录。 - jumxozizi
谢谢!我花了好大的力气才将一张表从一台机器复制到另一台无法直接通信的机器上。使用导入/导出向导导出为平面文件很顺利,但是使用导入/导出向导导入此平面文件时会遇到各种奇怪问题,因为它是一个平面文件。这个方法完美地解决了这个问题。 - neminem

3

只是为了好玩。

由于我无法创建连接服务器,仅仅连接到生产服务器还不足以使用INSERT INTO,所以我做了以下操作:

  • 备份生产服务器数据库
  • 在我的测试服务器上恢复数据库
  • 执行插入语句

这是一个后门解决方案,但由于我有问题,它对我起作用了。

由于我使用SCRIPT TABLE AS / CREATE创建了空表,以便传输所有的键和索引,我不能使用SELECT INTOSELECT INTO仅在目标位置上不存在表时才工作,但它不会复制键和索引,因此您必须手动执行。使用INSERT INTO语句的缺点是必须手动提供所有列名,如果某些外键约束失败,则可能会遇到一些问题。

感谢所有回答,有一些很好的解决方案,但我决定接受marc_s的回答。


3

复制数据从源到目的地:

use <DestinationDatabase>
select * into <DestinationTable> from <SourceDataBase>.dbo.<SourceTable>

2
我有两个不同的服务器。如果我只有一个,这会起作用。 - no9
1
你创建了一个链接服务器吗?从你的问题中不太清楚。然后在上面的查询中(在<目标服务器>上执行),在<SourceDatabase>前面添加<SourceServer>的名称。 - David Brabant
无法创建链接服务器。请查看我对marc_s答案的回复。 - no9

2
可以通过 SQL Server Management Studio 中的“导入/导出数据…”来完成。

2

您无法选择源/目标服务器。

如果数据库在同一台服务器上,您可以执行以下操作:

如果表的列相等(包括顺序!),则可以执行以下操作:

INSERT INTO [destination database].[dbo].[destination table]
SELECT *
FROM [source database].[dbo].[source table]

如果您只需要备份/恢复源数据库一次,那么可以使用该方法。如果您需要更频繁地执行此操作,我建议您启动一个SSIS项目,在其中定义源数据库(您可以选择任何服务器上的任何连接),并创建一个项目,将数据移动到该项目中。 更多信息请参见:http://msdn.microsoft.com/en-us/library/ms169917%28v=sql.105%29.aspx

2
如果将它们添加为链接服务器,那么是可以的。http://msdn.microsoft.com/en-us/library/ms188279.aspx - Preet Sangha
哦,好吧,我自己不知道。谢谢你让我明白了这一点。在上述情况下,我仍然建议使用SSIS项目来完成这些任务。 - YvesR
SSIS对于一次性复制来说有点过载 - 但对于常规和增量加载,我也建议使用它! - Preet Sangha
由于 SQL2005 Express 不支持 SSIS。 - no9
1
SQL 2005 Express?标准版及以上版本都有SSIS。 - YvesR
是的...SSIS非常好,但我的大多数客户都使用Express版本...叹气。 - no9

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接