我目前正在從一個數據庫提取表到另一個數據庫的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,服務器也可以覆蓋「提示」,但它可以在內部使用,因此可以使用重複的行。 –
偉大的觀點,謝謝。無論如何要告訴內部使用什麼? –