83

我有两个 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。

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

4

12 回答 12

78

试试这个:

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

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

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

这应该工作得很好。

于 2012-06-13T06:24:17.987 回答
60

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

  1. 右键单击数据库-> 选择“任务”-> 选择“生成脚本”
  2. 选择要复制的特定数据库对象。假设一张或多张桌子。点击下一步
  3. 单击高级并向下滚动到“要编写脚本的数据类型”,然后选择“架构和数据”。点击确定
  4. 选择保存生成脚本的位置,然后单击下一步继续
于 2014-09-30T15:32:14.560 回答
11

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

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

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

于 2012-06-13T06:24:16.643 回答
10

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

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

于 2012-06-13T06:25:48.540 回答
10

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

  • 右键单击要从中复制的源数据库。
  • 选择任务 - 导出数据。
  • 在数据源中选择 Sql Server Native Client。
  • 选择您的身份验证类型(Sql Server 或 Windows 身份验证)。
  • 选择源数据库。
  • 接下来,选择目标:Sql Server Native Client
  • 输入您的服务器名称(要将表复制到的服务器)。
  • 选择您的身份验证类型(Sql Server 或 Windows 身份验证)。
  • 选择目标数据库。
  • 选择复制数据。
  • 从列表中选择您的表。
  • 点击下一步,选择立即运行,或者如果您想稍后运行,也可以选择将包保存到文件或 Sql Server。
  • 结束
于 2019-03-29T12:39:23.167 回答
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>
于 2012-06-13T06:38:40.003 回答
3

用于将数据从源复制到目标:

use <DestinationDatabase>
select * into <DestinationTable> from <SourceDataBase>.dbo.<SourceTable>
于 2012-06-13T06:23:06.760 回答
3

只是为了踢球。

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

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

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

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

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

于 2012-06-13T11:39:10.863 回答
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

于 2012-06-13T06:22:42.040 回答
2

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

于 2015-03-28T01:06:30.150 回答
1

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

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

现在创建要添加包含所有列和索引的数据的表。这可以通过右键单击实际表并选择 Create To script 选项轻松完成。

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

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

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

注意:如果有任何基于身份的字段,在目标表中您可能希望删除身份属性,因为该数据也将被插入。因此,如果您仅将其作为 Identity 属性,则导入过程会出错。

现在点击下一步并点击完成,它将显示正在导入的记录数,如果没有发生错误则返回成功。

于 2014-07-16T20:08:43.627 回答
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
于 2017-11-03T15:48:09.557 回答