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


72

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

我想将几个表从一个迁移到另一个。

我试过了:

  • 在源服务器上,我右键单击数据库,选择Tasks/Generate scripts。问题在于,在此之下Table/View options没有Script data选择。

  • 然后,我用来Script Table As/Create script生成SQL文件,以便在目标服务器上创建表。但是我仍然需要所有数据。

然后我尝试使用:

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

但是我得到了错误:

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

有人可以为我指出解决问题的正确方法吗?


1
您可以显示一些生成的语句吗?您是否已将其他服务器添加为链接服务器?
Preet Sangha 2012年

不作为链接服务器。这没有意义,因为两者都是mssql2005。我刚刚创建了连接。必须链接服务器吗?
2012年

“ Into”语句(用于创建表并将其插入)仅支持本地表。您必须首先创建表,然后使用“插入[目标服务器]。[目标数据库]。[dbo]。[目标表]”。
jumxozizi

最简单的方法是进行备份(包含数据),然后在目标数据库中还原
Naga

我收到类似服务器不可用/未链接的错误。所以我用下面的命令,然后它可以工作USE主人; GO EXEC sp_addlinkedserver N'服务器名',N'SQL Server'; 去
karthik G

Answers:


73

尝试这个:

  1. 使用Script Table As / Create Script步骤中的脚本在目标服务器上创建表

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

    INSERT INTO dbo.YourTableNameHere
       SELECT *
       FROM [SourceServer].[SourceDatabase].dbo.YourTableNameHere
    

这应该很好。


2
我喜欢你的建议。我尝试了,我得到了。在sys.servers中找不到服务器“”。验证是否指定了正确的服务器名称...也许是因为源服务器名称为“ NAME \ NAME2”格式而导致的问题?但是我认为[]应该解决该问题。
2012年

18
@ no9:对不起-当然,要执行此操作,必须在两个服务器之间添加一个“链接服务器”
marc_s 2012年

1
是的 但是想象一下,我在创建链接服务器时遇到问题。生产服务器设置为允许远程连接,但是即使使用模拟或直接使用usr / pwd,我仍然会超时。由于服务器管理不在我的域内,因此我无能为力。但是我设法用另一种方式解决了我的问题。由于我喜欢该解决方案,因此将发布一个anerser只是为了娱乐并接受您的。
2012年

53

仅显示另一个选项(对于SQL Server 2008及更高版本):

  1. 右键单击数据库->选择'任务'->选择'生成脚本'
  2. 选择要复制的特定数据库对象。假设一个或多个表格。点击下一步
  3. 单击高级,然后向下滚动到“要脚本的数据类型”,然后选择“架构和数据”。点击确定
  4. 选择保存生成的脚本的位置,然后单击下一步继续

2
该选项在OP最有可能引用的Microsoft SQL Management Studio版本9(随附SQL Server 2005)中不可用。
Marcel

2
好的解决方案,但是对于大表开始出现问题。
杜安(Duane)

10

任务/生成脚本中有脚本表选项!一开始我也很想念它!但是您可以在此处生成插入脚本(非常不错的功能,但是在非常不直观的地方)。

当您进入“设置脚本选项”步骤时,请转到“高级”选项卡。

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


8

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

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


我要从中导出表的数据库上没有导出数据选项。它只是:分离,缩小,备份,还原,生成脚本...
2012年

脚本向导也可以导出数据
user763539

@ user763539-真的吗?我上次检查时没有选择生成包含例如INSERT语句的脚本的选项。对于sql-server-2005似乎肯定是正确的。您有链接或参考吗?
Damien_The_Unbeliever

到目前为止对我来说最好的解决方案!
Shai Alon

@Damien_The_Unbeliever为什么您坚持要生成脚本?那不是问题……
Shai Alon

8

如果您没有链接服务器的权限,请按照以下步骤使用Sql Server导入/导出向导将表从一台服务器导入到另一台服务器:

  • 右键单击要复制的源数据库。
  • 选择任务-导出数据。
  • 在数据源中选择“ Sql Server Native Client”。
  • 选择您的身份验证类型(Sql Server或Windows身份验证)。
  • 选择源数据库。
  • 接下来,选择目标:Sql Server本机客户端
  • 键入您的服务器名称(要将表复制到的服务器)。
  • 选择您的身份验证类型(Sql Server或Windows身份验证)。
  • 选择目标数据库。
  • 选择复制数据。
  • 从列表中选择表格。
  • 单击“下一步”,选择“立即运行”,或者(可选),也可以将包保存到文件或Sql Server中(如果要稍后运行)。

1
事实证明,这对我来说是最简单的方法。虽然,ssms可以很大程度地/缓慢地打开该向导!
Shahryar Saljoughi'5

6

如果已经使用脚本创建了表,那么还有另一种复制数据的方法是使用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
我以前见过,但是由于我是从生产服务器中导出的,因此我没有(仍然不是)确定它是否安全:)
2012年

1
您不修改表以使其绝对安全,但请记住正确使用IN或OUT语句。入获取从文本文件到表的数据,而出获取从表文件到文本文件(或csv文件)的数据
praveen 2012年

使用“ -T”进行信任连接,或使用“ -U <用户名> -P <密码>”进行SQL登录。
jumxozizi

3

只是为了踢。

由于我无法创建链接服务器,并且仅连接到生产服务器还不够用,所以INSERT INTO我做了以下工作:

  • 创建了生产服务器数据库的备份
  • 在测试服务器上还原数据库
  • 执行insert into语句

它是一个后门解决方案,但是由于我遇到了问题,因此对我有用。

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

感谢所有anwser,有一些很棒的解决方案,但是我决定接受marc_s anwser。


2

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

如果数据库位于同一服务器上,则可以执行以下操作:

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

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

如果要执行此操作,则可以备份/还原源数据库。如果您需要更频繁地执行此操作,建议您启动一个SSIS项目,在其中定义源数据库(可以在任何服务器上选择任何连接),并创建一个项目,在其中将数据移到那里。在此处查看更多信息:http : //msdn.microsoft.com/zh-cn/library/ms169917%28v=sql.105%29.aspx


2
是的,如果您将它们添加为链接服务器,则可以。msdn.microsoft.com
zh

哦,哦,我自己都不知道。谢谢你的启发。在上述情况下,我仍然建议针对此任务的SSIS项目。
YvesR 2012年

对于一次性复制,SSIS有点过载-但是对于常规和增量负载,我也建议这样做!
Preet Sangha 2012年

由于不支持其SQL2005 Express SSIS。
2012年

1
SQL 2005 Express?标准及以上具有SSIS。
YvesR 2012年

2

要将数据从源复制到目标:

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

我有两个不同的服务器。如果我只有一个,这将起作用。
2012年

1
您是否创建了链接服务器?您的问题不清楚。然后在上述查询中的<SourceDatabase>前面添加<SourceServer>的名称(在<DestinationServer>上执行)。
David Brabant 2012年

无法创建链接服务器。请参阅我对marc_s
anwser的

2

可以通过SQL Server Management Studio中的“导入/导出数据...”完成此操作


1

这在某种程度上是一种解决方案,但是它对我有用,我希望它对其他人也可以解决此问题:

您可以在要导出的表上运行select SQL查询,并将结果另存为驱动器中的.xls。

现在,创建要添加所有列和索引的数据的表。右键单击实际表并选择“创建至脚本”选项,可以轻松完成此操作。

现在,您可以右键单击要在其中添加表的数据库,然后选择Tasks> Import。

导入导出向导打开并选择下一步。选择Microsoft Excel作为输入数据源,然后浏览并选择您之前保存的.xls文件。

现在,选择目标服务器以及我们已经创建的目标表。

注意:如果有任何基于身份的字段,则可能要在目标表中删除identity属性,因为还将插入此数据。因此,如果仅将此属性作为身份属性,则会使导入过程出错。

现在点击下一步并点击完成,它将显示您正在导入多少条记录,如果没有错误,则返回成功。


这里对我来说,关键的事情是能够选择性地将数据选择导出
彼得·中号

0

如果有可用的另一种选择:c#.net。特别是Microsoft.SqlServer.Management.Smo命名空间。

我在一个SSIS包的脚本组件中使用类似于以下代码的代码。

var tableToTransfer = "someTable";
var transferringTableSchema = "dbo";

var srvSource = new Server("sourceServer");
var dbSource = srvSource.Databases["sourceDB"];

var srvDestination = new Server("destinationServer"); 
var dbDestination = srvDestination.Databases["destinationDB"];

var xfr = 
    new Transfer(dbSource) {
        DestinationServer = srvDestination.Name,
        DestinationDatabase = dbDestination.Name,
        CopyAllObjects = false,
        DestinationLoginSecure = true,
        DropDestinationObjectsFirst = true,
        CopyData = true
    };

xfr.Options.ContinueScriptingOnError = false; 
xfr.Options.WithDependencies = false; 

xfr.ObjectList.Add(dbSource.Tables[tableToTransfer,transferringTableSchema]);
xfr.TransferData();

我认为我必须显式搜索并将Microsoft.SqlServer.Smo库添加到引用中。但是除此之外,这已经为我解决了。

更新:名称空间和库比我记得的要复杂。

对于库,添加对以下内容的引用:

  • Microsoft.SqlServer.Smo.dll
  • Microsoft.SqlServer.SmoExtended.dll
  • Microsoft.SqlServer.ConnectionInfo.dll
  • Microsoft.SqlServer.Management.Sdk.Sfc.dll

对于命名空间,添加:

  • Microsoft.SqlServer.Management.Common
  • Microsoft.SqlServer.Management.Smo
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.