Массовая вставка SQL: обновление строк - PullRequest
0 голосов
/ 29 марта 2011

У меня есть процесс, который массово вставляет в таблицу из CSV. Теперь у меня есть требования, чтобы некоторые данные, поступающие из CSV, содержали «обновленные» записи (данные, которые были импортированы ранее, но теперь имеют изменения).

На данный момент у меня есть таблица, полная дубликатов. Возможно ли BULK INSERT обновить (или даже удалить перед вставкой) записи, основанные на PK?

Я бы не стал добавлять второй шаг в этот процесс для удаления дубликатов.

Edit: вместо промежуточной таблицы я просто собираюсь выполнить запрос на удаление, подобный следующему

declare @tbl table
(
id int,
ref nvarchar(10)
)

insert into @tbl
values(1, 'AAAA'),
(2, 'BBBB'),
(3, 'CCCC'),
(4, 'AAAA'),
(5, 'BBBB'),
(6, 'AAAA')

delete from @tbl where id in (
select id from
(
select
    id,
    ref,
    RANK() OVER(partition by ref order by id desc) as rnk
from @tbl) d
where rnk > 1
)

select * from @tbl

Ответы [ 3 ]

6 голосов
/ 29 марта 2011

Если бы это был я, я бы загрузился на промежуточный стол и оттуда сделал бы дурака.Я не уверен, что BCP обладает такой функциональностью, но я был бы обеспокоен любой логикой, которую я делаю, чтобы у меня не было прямого и видимого контроля.

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

2 голосов
/ 29 марта 2011

Перейти с промежуточной таблицей и выполнить upsert (MERGE - http://msdn.microsoft.com/en-us/library/bb522522.aspx)

Даже если бы вы посмотрели на SSIS для этой операции и вставили недостающие строки в один поток, я все равно массово вставил бы обновленияв промежуточную таблицу в другом потоке и запустите одно ОБНОВЛЕНИЕ в задаче SQL, потому что выполнение команды SQL для отдельных строк для обновления НЕ очень быстрое.

2 голосов
/ 29 марта 2011

Массовая загрузка в промежуточную таблицу с идентификатором, что позволяет узнать порядок загрузки и обработать любые дубликаты.Затем вы можете заполнить свои фактические таблицы различными способами (использовать первое / последнее вхождение строки dup и т. Д.), Включая MERGE (Transact-SQL) .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...