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

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

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

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

Спасибо,

Рокал


person user24358    schedule 23.10.2008    source источник


Ответы (5)


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

ОБНОВЛЕНИЕ: «задача запроса, управляемая данными» DTS позволит вставлять|обновлять данные из соединения с сервером sql в DTS в соединение с сервером oracle в DTS без временной таблицы или связанного сервера.

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

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

person Booji Boy    schedule 24.10.2008
comment
Booji Boy: Да, я могу создать ссылку на базу данных и написать два запроса на основе данных. Я надеялся, что есть способ без использования связанных серверов или промежуточных таблиц. - person user24358; 25.10.2008
comment
Я нашел дополнительную информацию о задачах запросов, управляемых данными, в DTS. Дайте мне знать, если это поможет - я мог бы выкопать (или сделать) и отправить вам пример. - person Booji Boy; 27.10.2008

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

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

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

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

person Robert    schedule 23.10.2008

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

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

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

person user24358    schedule 24.10.2008

Пытаться:

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

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

Delete a
from firstTable a join secondTable b on a.id = b.id
person P2theK    schedule 18.01.2010

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

Заявление 1:

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

Заявление 2:

INSERT INTO dbo.WhateverTable 
SELECT * FROM MySource

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

person Timothy Khouri    schedule 24.10.2008
comment
Тимоти Хури: Ваш метод потребует ссылки на базу данных, правильно? - person user24358; 25.10.2008
comment
слияние ведет себя как вставка или обновление в одном выражении в tsql - person Robert; 30.10.2008