我正在使用SQL Server 2008 Enterprise。我需要将所有数据从服务器/实例“Server Foo”,数据库“Foo”和表“Foo”导入目标服务器/实例“Server Goo”,数据库“Goo”和表“Goo”。表Foo和Table Goo具有相同的模式。如果表Goo存在相同的行,我想将原始数据保存在Goo中,并且在Foo中输入导入行(表Foo和表Goo都有一个名为CustomerID的uniqueidentifier类型列,它充当主键和聚簇索引),喜欢忽略重复键。
我正在寻找简单可靠的方法来编写T-SQL来解决数据导出/导入问题。任何参考样品?
编辑1:
我使用MERGE尝试了以下解决方案,但遇到了SQL Server Management Studio中的以下错误。有什么想法是错的吗?
更多信息:
LabTest1 \ SQLServer2008 =>服务器\实例名称; OrderDB =>数据库名称; dbo =>模式名称; 订单=>表名。
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
;
错误讯息:
Msg 102,Level 15,State 1,Line 16 ';'附近的语法不正确。
提前谢谢, 乔治答案 0 :(得分:8)
在SQL Server 2008中,您可以在SQL Server Mgmt studio中编写Goo.Goo表的脚本,并告诉它还创建一个脚本以使用T-SQL INSERT
语句插入所有数据。转到对象资源管理器,右键单击数据库,选择“任务>生成脚本”,选择要为其生成数据插入语句的表,并确保在此处使用此选项:
然后可以在其他服务器上运行这些内容以插入表内容。但是,在这种情况下,您必须自己处理插入可能存在的行。
另一方面,如果两个服务器位于同一网络上,您可以使用“链接服务器”功能并将源服务器链接到目标服务器,然后使用SQL Server 2008 MERGE语句导入所有数据从源srever的表到目标服务器。
在对象资源管理器中,转到“服务器对象”,然后“链接服务器”,右键单击“添加新链接服务器”以在两个服务器之间建立连接:
链接服务器后,一个简单的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联机丛书中。
马克
答案 1 :(得分:1)
如果您使用的是SQL Server企业版,那么为什么使用原始T-SQL代码会让您的项目变得困难?
您可以使用SQL Server Integration Services(SSIS)以更简单,更健壮的方式实现您的目标,这是一项专门用于执行ETL任务的技术,当然也包含在您的SQL Server版本中。
预先构建的组件已经存在,以您希望的方式处理数据,您还可以轻松地将审核和日志记录功能整合到您的解决方案中。
你想要实现的目标可以通过纯粹的T-SQL编码实现,但是你会在这个过程中让自己的生活变得更加困难,在我看来,最终的解决方案很可能很麻烦而且不那么优雅。
答案 2 :(得分:0)
对于我遇到类似问题时,我只是从SQL Server Management Studio输出窗口复制数据并将其粘贴到Excel文件中,然后使用此工具将数据导入另一个数据库: