我使用SQL Server 2008企业版。 我需要从服务器/实例“服务器富”导入所有数据,数据库“foo”和表“富”,到目的地的服务器/实例“服务器咕”数据库“咕”和表“咕”。 表foo和表粘粘是相同的架构。 如果同一行存在于表咕,我想保持在粘粘源数据则会忽略Foo中导入行(表Foo和表咕既具有叫做客户ID唯一标识符类型的列充当主键和聚集索引),只是像忽略重复键一样。
我在寻找简单可靠的方法来写T-SQL来解决数据导出/导入问题。 任何参考样本?
编辑1:
我曾尝试用MERGE下面的解决方案,但遭到了SQL Server Management Studio中下面的错误。 任何想法有什么不好?
一些更多的信息:
LabTest1 \ SQLServer2008的=>服务器\实例名; OrderDB => DB名; 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
;
错误信息:
消息102,级别15,状态1,行16附近有语法错误 ';'。
在此先感谢,乔治
在SQL Server 2008中,你可以在SQL Server管理工作室脚本你的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语句:
- http://www.builderau.com.au/program/sqlserver/soa/Using-SQL-Server-2008-s-MERGE-statement/0,339028455,339283059,00.htm
- http://www.sqlservercentral.com/articles/Advanced+Querying/3122/
或者在SQL Server 2008联机丛书。
渣
如果您使用的SQL Server企业版,为什么让你的项目很难为自己使用的原始T-SQL代码?
您可以通过实现自己的目标更简单和稳健的方式SQL Server集成服务 (SSIS),技术专门设计用于执行ETL任务,当然是包含在你的SQL Server版。
预建的组件已经存在处理的方式,你想要的数据和你有能够轻松地将审计和日志记录功能集成到您的解决方案额外的奖励。
你在找什么,以实现可通过纯粹的T-SQL代码来完成,但是你将作出的生活为自己更困难的过程中,得到的溶液会,在我看来,最有可能是繁琐,那么优雅。
对我来说,当我有类似的问题,我刚刚从SQL Server Management Studio中的输出窗口复制的数据,并将其粘贴到Excel文件,然后导入数据到使用此工具的其他数据库:
http://www.codeproject.com/KB/database/Excel2Sql.aspx