【问题标题】:import data from one table to another table将数据从一个表导入到另一个表
【发布时间】:2009-08-05 07:54:11
【问题描述】:

我使用的是 SQL Server 2008 Enterprise。我需要将服务器/实例“Server Foo”、数据库“Foo”和表“Foo”中的所有数据导入目标服务器/实例“Server Goo”、数据库“Goo”和表“Goo”。 Table Foo 和 Table Goo 具有相同的架构。如果表 Goo 存在同一行,我想将原始数据保留在 Goo 中,并在 Foo 中导入导入行(表 Foo 和表 Goo 都有一个名为 CustomerID 的唯一标识符类型列,它充当主键和聚集索引),只是就像忽略重复键一样。

我正在寻找简单可靠的方法来编写 T-SQL 来解决数据导出/导入问题。有参考样本吗?

编辑 1:

我使用 MERGE 尝试了以下解决方案,但遇到了来自 SQL Server Management Studio 的以下错误。有什么想法有什么问题吗?

更多信息:

LabTest1\SQLServer2008 => 服务器\实例名称; OrderDB => 数据库名称; dbo => 模式名称; Orders => 表名。

merge into [dbo].[Orders] as Target
using "LabTest1\SQLServer2008.OrderDB.dbo.Orders" as source
on target.Hash = source.Hash
when not matched then
INSERT     ([Hash]
           ,[Order]
           ,[Name]
           ,[CreationTime]
           ,[Description])
     VALUES
     (
     source.[Hash], source.[Order], source.[Name], source.[CreationTime], source.[Description]
     )
when MATCHED then
;

错误信息:

消息 102,级别 15,状态 1,第 16 行 ';' 附近的语法不正确。

提前致谢, 乔治

【问题讨论】:

  • 然后一起删除 WHEN MATCHED THEN 行 - 如果源条目和目标条目匹配,您什么都不做,对吧?您可以在此处发出 UPDATE 语句

标签: sql sql-server tsql sql-server-2008


【解决方案1】:

在 SQL Server 2008 中,您可以在 SQL Server Mgmt studio 中编写 Goo.Goo 表的脚本,并告诉它还创建一个脚本以使用 T-SQL INSERT 语句插入所有数据。转到对象资源管理器,右键单击数据库,选择“任务 > 生成脚本”,选择要为其生成数据插入语句的表,并确保在此处使用此选项:

然后可以在其他服务器上运行这些以插入表格内容。但是,在这种情况下,您必须自己处理插入可能存在的行。

另一方面,如果两台服务器在同一个网络上,您可以使用“链接服务器”功能,将源服务器链接到目标服务器,然后使用 SQL Server 2008 MERGE 语句导入所有数据从源服务器的表到目标服务器。

在对象资源管理器中,转到“服务器对象”,然后转到“链接服务器”,右键单击并“添加新链接服务器”以在两个服务器之间建立连接:

连接服务器后,一个简单的 MERGE 语句(SQL Server 2008 中的新功能)将允许您合并这两个表中的数据:

MERGE 
  INTO Goo.Goo as Target
  USING Foo.Foo.dbo.Foo as Source
  ON Source.ID = Target.ID
WHEN NOT MATCHED THEN
  INSERT (field1, field2, field3)
  VALUES (source.field1, source.field2, source.field3)  
WHEN MATCHED THEN
  -- do nothing
;

在此处阅读有关新 MERGE 语句的更多信息:

或在 SQL Server 2008 联机丛书中。

马克

【讨论】:

  • 感谢 Marc,对于链接服务器,如何在新建链接服务器向导中填写“链接服务器”值?我尝试输入机器名称但失败。
  • 您是否在“新建链接服务器/常规”页面上选择了“SQL Server”选项?只需输入要链接到的 SQL Server 实例的名称。在向导的其他页面上,您可能还需要指定凭据以连接到该服务器实例
  • 谢谢 Marc,如果我的源服务器名称是 foo,实例名称是 fooinstance,我应该输入 foo\fooinstance?您推荐的凭据设置是什么?
  • 是的,输入“foo\fooinstance”——应该可以。至于凭据 - 这完全取决于您。使用您已有的现有帐户(例如,应用程序连接到数据库的帐户),或创建一个特定的帐户 - 任何适合您的方法
  • 然后一起删除 WHEN MATCHED THEN 行 - 如果源条目和目标条目匹配,您什么都不做,对吧?您可以在此处发出 UPDATE 语句
【解决方案2】:

如果您使用的是 SQL Server 企业版,那么为什么要使用原始 T-SQL 代码让您的项目变得困难?

您可以使用SQL Server Integration Services (SSIS) 以更简单、更可靠的方式实现您的目标,这是一种专门用于执行 ETL 任务的技术,当然也包含在您的 SQL Server 版本中。

已经存在用于以您希望的方式处理数据的预构建组件,并且您还可以轻松地将审计和日志记录功能整合到您的解决方案中。

您希望实现的目标可以通过纯 T-SQL 编码来完成,但是在此过程中您会让自己的生活变得更加困难,而且在我看来,由此产生的解决方案很可能既麻烦又不那么优雅。

【讨论】:

  • 您好 John,无法打开 SSIS URL。 :-)
【解决方案3】:

对于我来说,当我遇到类似问题时,我只是从 SQL Server Management Studio 输出窗口复制数据并将其粘贴到 Excel 文件中,然后使用此工具将数据导入其他数据库:

http://www.codeproject.com/KB/database/Excel2Sql.aspx

【讨论】:

    猜你喜欢
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-28
    • 2015-10-08
    • 2014-10-15
    • 1970-01-01
    相关资源
    最近更新 更多