2

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

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

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

谢谢,

罗卡尔

4

5 回答 5

1

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

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

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

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

于 2008-10-24T02:42:42.360 回答
0

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

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

或者你可以自己写。

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

于 2008-10-23T09:02:24.373 回答
0

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

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

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

于 2008-10-24T00:23:01.863 回答
0

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

声明 1:

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

声明 2:

INSERT INTO dbo.WhateverTable 
SELECT * FROM MySource

另外,您是否有任何理由不想使用临时表?

于 2008-10-24T10:04:44.170 回答
0

尝试:

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
于 2010-01-18T11:02:44.247 回答