Использование пакета SQL Server DTS для условной вставки / обновления строк в таблице назначения - PullRequest
2 голосов
/ 23 октября 2008

Я хочу создать пакет DTS для извлечения данных из таблицы Oracle в SQL2K Таблица. Как я могу вставить строки, которых еще нет в таблице SQL2K и обновить строки, которые уже существуют в таблице SQL2K?

Полагаю, я мог бы усечь и снова заполнить всю таблицу или создать временную таблицу, а затем сделать обновления / вставки из временной таблицы в таблица назначения.

Есть ли более простой способ использования DTS?

Спасибо

Rokal

Ответы [ 5 ]

1 голос
/ 24 октября 2008

Вы можете сделать это в пакете DTS, используя две управляемые данными задачи запроса: одну для вставок и одну для обновлений. Задачи запросов, управляемые данными, немного неудобны в использовании, но они работают. Я также сделал это («слияние») в SQL Server 2000 с базой данных AS / 400, используя динамический T-SQL. Вы бы написали скрипт t-sql, который выводит psql и снова запускает его на связанном сервере с базой данных Oracle.

UPDATE: «Задача запроса данных, управляемая данными» будет позволять вам вставлять | обновлять данные из соединения с сервером sql в DTS в соединение с сервером Oracle в DTS без временной таблицы или связанного сервера.

Update2; вот еще немного информации о том, что я имею в виду: http://www.databasejournal.com/features/mssql/article.php/3315951

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

0 голосов
/ 18 января 2010

Попробуйте:

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

Это может быть довольно медленно, используйте вместо этого объединение:

Delete a
from firstTable a join secondTable b on a.id = b.id
0 голосов
/ 24 октября 2008

В TSQL нет способа сделать INSERT или UPDATE в одном выражении, но вы можете очень легко сделать это в двух утверждениях (как вы упоминали выше).

Заявление 1:

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

Заявление 2:

INSERT INTO dbo.WhateverTable 
SELECT * FROM MySource

Кроме того, есть ли причина, по которой вы не хотите использовать временную таблицу?

0 голосов
/ 24 октября 2008

Да, значения первичного ключа в источнике и пункте назначения будут совпадать.

Я надеялся выполнить эту задачу без использования временной (промежуточной) таблицы.

Кроме того, я использую SQL Server 2000, поэтому оператор MERGE недоступен.

0 голосов
/ 23 октября 2008

Вы сохраняете те же значения первичного ключа?

Если у вас есть несколько вариантов, некоторые версии SQL поддерживают оператор MERGE, который будет обновляться или вставляться так, как вам требуется.

Или вы можете написать свой собственный.

Что-то похожее на загрузку всех строк в промежуточную таблицу в вашей базе данных SQL и построчную проверку на наличие вашего первичного ключа в основной таблице SQL. Если ключ существует, обновите строку и, если нет, вставьте ее.

...