我目前正在从一个数据库提取表到另一个数据库的SSIS包。两个数据库中的表都使用与主键相同的列。我选择语句来提取数据是一个简单的选择语句。当我运行包时,我收到一个错误,那里有重复的主键值。SQL Server查询返回多行
我回顾了我的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
感谢您的信息。我在帖子中添加了我正在使用的select语句。 为什么要抢两行?第一次读它之后,为什么更改记录会导致它再次读取它? –
请记住,即使您不使用NOLOCK,服务器也可以覆盖“提示”,但它可以在内部使用,因此可以使用重复的行。 –
伟大的观点,谢谢。无论如何要告诉内部使用什么? –