使用 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表之间的导入或者导出?
无法从 dtexec 在 sql server 2008 中执行 DTS
如何删除大量数据 sql server2005 数据量在8千万左右??