使用 SQL Server DTS 包有条件地在目标表中插入/更新行

Posted

技术标签:

【中文标题】使用 SQL Server DTS 包有条件地在目标表中插入/更新行【英文标题】:Using SQL Server DTS Package to Conditionally Insert / Update Rows in Destination Table 【发布时间】:2008-10-23 00:10:20 【问题描述】:

我想创建一个 DTS 包以将数据从 Oracle 表中提取到 SQL2K 桌子。如何插入尚未在 SQL2K 表中的行和 更新 SQL2K 表中已经存在的行?

我想我可以截断并重新填充整个表或创建一个 临时表,然后将临时表中的更新/插入到 目标表。

有没有更简单的使用 DTS 的方法?

谢谢,

罗卡尔

【问题讨论】:

【参考方案1】:

您可以在 DTS 包中使用两个数据驱动的查询任务来执行此操作:一个用于插入,另一个用于更新。数据驱动的查询任务使用起来有点麻烦,但它们确实有效。我还在使用动态 t-sql 的 AS/400 数据库的 sql server 2000 中完成了这个(“合并”)。您将编写一个 t-sql 脚本,该脚本输出 psql 并在连接到 Oracle 数据库的链接服务器上再次运行它。

更新: DTS“数据驱动查询任务”让您将数据从 DTS 中的 sql server 连接插入|更新到 DTS 中的 oracle 服务器连接,无需临时表或链接服务器。

更新2;这里有一些关于我的意思的更多信息: http://www.databasejournal.com/features/mssql/article.php/3315951

http://msdn.microsoft.com/en-us/library/aa933507(SQL.80).aspx

【讨论】:

Booji Boy:是的,我可以创建一个数据库链接并编写两个数据驱动的查询。我希望有一种方法可以不使用链接服务器或临时表。 我发现了一些关于 DTS 中数据驱动查询任务的附加信息。让我知道它是否有帮助 - 我可能会挖掘(或制作)并向您发送示例。【参考方案2】:

您是否保持相同的主键值?

如果您有多种选择,某些版本的 SQL 支持 MERGE 语句,该语句将按照您的需要进行更新或插入。

或者你可以自己写。

类似于将所有行加载到 SQL 数据库中的临时表中,并逐行检查主 SQL 表中是否存在主键。如果键存在则更新行,如果不存在则插入。

【讨论】:

【参考方案3】:

是的,源和目标中的主键值将匹配。

我希望在不使用临时(暂存)表的情况下完成这项任务。

另外,我使用的是 sql server 2000,所以 MERGE 语句不可用。

【讨论】:

【参考方案4】:

试试:

DELETE FROM dbo.WhateverTable WHERE WhateverTableID IN (SELECT WhateverTableID FROM MySource)

这可能很慢,请改用 join:

Delete a
from firstTable a join secondTable b on a.id = b.id

【讨论】:

【参考方案5】:

TSQL 无法在同一个语句中执行 INSERT 或 UPDATE,但您可以很容易地在两个语句中执行(如上所述)。

声明 1:

DELETE FROM dbo.WhateverTable 
WHERE WhateverTableID IN (SELECT WhateverTableID FROM MySource)

声明 2:

INSERT INTO dbo.WhateverTable 
SELECT * FROM MySource

另外,你有什么理由不想使用临时表吗?

【讨论】:

Timothy Khouri:你的方法需要数据库链接对吗? merge 的行为类似于 tsql 中的一条语句中的插入或更新

以上是关于使用 SQL Server DTS 包有条件地在目标表中插入/更新行的主要内容,如果未能解决你的问题,请参考以下文章

[转载]在SQL Server 中,如何实现DBF文件和SQL Server表之间的导入或者导出?

基于SQL Server版本的SQL CLR条件编译

无法从 dtexec 在 sql server 2008 中执行 DTS

如何删除大量数据 sql server2005 数据量在8千万左右??

SQL Server 2005 DTS导入平面数据源时(如txt文档),总是被截断,无法执行的错误解决方案

用Java连接sqlserver数据库时候几个jar包有啥区别?