В настоящее время я работаю над пакетом служб SSIS, который извлекает таблицу из одной базы данных в другую. Таблицы в обеих базах данных используют тот же столбец, что и первичный ключ. Мой оператор выбора для извлечения данных является простым оператором выбора. Когда я запустил пакет, я получил сообщение об ошибке, где есть дубликаты значений первичного ключа.
Я просмотрел свой оператор выбора и убедился, что мой оператор выбора не возвращал повторяющиеся строки. Поэтому, чтобы проверить это, я удалил первичный ключ из таблицы, в которую вставляю данные, и перезапустил пакет служб SSIS. После того, как он побежал, я посмотрел на таблицу, чтобы увидеть, какие строки дублируются. Я обнаружил, что строки, которые были отредактированы во время работы извлечения, где были продублированы, имели запись об этом до редактирования и запись об этом после редактирования. Я мог бы легко сказать это, потому что таблица имеет последнее измененное поле, которое обновляется каждый раз, когда обновляется запись.
Я добавил подсказку NOLOCK в свой оператор select, и он перестал возвращать повторяющиеся строки.
Итак, мой вопрос - почему? Я ожидал бы, что оператор select с подсказкой таблицы NOLOCK будет иметь больше шансов на возврат дублирующихся строк, потому что он не использует блокировку, и что оператор select без подсказки NOLOCK должен использовать блокировку, чтобы убедиться, что он не возвращает дубликат строки.
Вот оператор выбора, который я использую для выбора данных. Я проверил, что объединения не вызывают дублирование строк:
SELECT pe.enc_id,
pe.enc_nbr,
pe.billable_ind,
pe.clinical_ind AS clinical_ind,
pe.budget_ind,
pe.print_stmt_ind,
pe.send_coll_letter_ind,
pe.outsource_exempt_ind,
cb.First_name + ' ' + cb.last_name AS CreatedBy,
pe.create_timestamp AS create_timestamp,
mb.first_name + ' ' + mb.last_name AS ModifiedBy,
pe.modify_timestamp AS modify_timestamp
FROM patient_encounter pe WITH(NOLOCK)
LEFT OUTER JOIN user_mstr cb WITH(NOLOCK) ON
pe.created_by = cb.user_id
LEFT OUTER JOIN user_mstr mb WITH(NOLOCK) ON
pe.modified_by = mb.user_id