我目前正在开发一个 SSIS 包,该包将表从一个数据库提取到另一个数据库。两个数据库中的表都使用同一列作为主键。我提取数据的 select 语句是一个简单的 select 语句。当我运行该包时,我收到一条错误,指出存在重复的主键值。
我检查了我的 select 语句并验证了我的 select 语句没有返回重复的行。因此,为了测试这一点,我从要插入数据的表中删除了主键,并重新运行 SSIS 包。运行后,我查看表以查看哪些行被重复。我发现,在提取运行时正在编辑的行是重复的,在编辑之前有一条记录,在编辑后也有一条记录。我可以很容易地看出这一点,因为该表有一个最后修改的字段,每次更新记录时该字段都会更新。
我在 select 语句中添加了 NOLOCK 提示,它停止返回重复的行。
所以我的问题是为什么?我本以为带有 NOLOCK 表提示的 select 语句更有可能返回重复行,因为它没有使用锁定,并且没有 NOLOCK 提示的 select 语句应该使用锁定来确保它不会返回重复行行。
这是我用来选择数据的 select 语句。我确实验证了连接不会导致它重复行:
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