【发布时间】:2011-01-17 01:24:35
【问题描述】:
我目前正在开发一个 SSIS 包,该包将表从一个数据库提取到另一个数据库。两个数据库中的表都使用同一列作为主键。我提取数据的选择语句是一个简单的选择语句。当我运行这个包时,我收到了一个错误,那里有重复的主键值。
我查看了我的 select 语句并确认我的 select 语句没有返回重复的行。因此,为了测试这一点,我从要插入数据的表中删除了主键,并重新运行了 SSIS 包。运行后,我查看了表格以查看重复的行。我发现的是,在提取运行时正在编辑的行被复制,在编辑之前有它的记录,在编辑之后有它的记录。我可以很容易地看出这一点,因为该表有一个上次修改字段,每次更新记录时都会更新。
我在我的选择语句中添加了一个 NOLOCK 提示,它停止返回重复的行。
所以我的问题是为什么?我本来希望带有 NOLOCK 表提示的 select 语句返回重复行的机会更高,因为它没有使用锁定,并且没有 NOLOCK 提示的 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
【问题讨论】:
标签: sql-server ssis