2017-06-12 60 views
1

我想了解我正在執行的UPDATE/REPLACE的行爲,即刪除一些無效數據並用首選數據替換。TSQL - SELECT TOP和UPDATE影響比預期更多的行

UPDATE執行正常,並做它需要做的事情,但受影響的行不是我所期望的在某些情況下(我在多個數據庫中執行此操作)。

我已經把下面(其餘基本上是複製跨多個表的相同功能)

UPDATE TBL_HISTORY 
SET DETAILS = REPLACE(DETAILS,'&QUOT','Times New Roman') 
WHERE HISTORYID IN 
(SELECT TOP 1000 (HISTORYID) FROM TBL_HISTORY 
WHERE DETAILS LIKE '%&QUOT%') 

GO 

什麼我想像上面的腳本發生是選擇TOP 1000記錄的腳本的一部分在TBL_HISTORY中包含不需要的數據字符串並執行REPLACE

結果發生在有超過1000個受影響的行的情況下,它將更新所有這些行,例如返回受影響的1068行的值。

HISTORYID是桌上的PK。我誤解這應該如何工作?任何指導將不勝感激。

+1

我可以看到這種可能的唯一方法是如果表中沒有包含'SET NOCOUNT ON'的觸發器。否則,如果'HISTORYID'是唯一的,則不會有超過1000行受到影響。 –

+0

如果將上述內容轉換爲「SELECT」語句,會返回多少行? 'SELECT COUNT(*)FROM TBL_HISTORY WHERE HISTORY_ID IN(SELECT TOP [...]'?我傾向於HISTORYID並不是唯一的... – Shaneis

+0

@Shaneis:HISTORYID是PK。它必須是唯一的OP。 –

回答

1

試試這個(它更快)。如果它仍然更新超過1000行,這是由於觸發器。如果它更新1000行,那麼HISTORYID不是主鍵(複合主鍵)中唯一的列。

;WITH CTE as 
(
    SELECT top 1000 
    DETAILS 
    FROM 
    TBL_HISTORY 
    WHERE 
    DETAILS LIKE '%&QUOT%' 
) 
UPDATE CTE 
SET DETAILS = REPLACE(DETAILS,'&QUOT','Times New Roman') 
+1

太好了,謝謝你,我會放手去檢查一下表演。就PK而言,它絕對是一個列鍵,桌子上沒有觸發器。我將恢復其中一個數據庫的「預先修復」的備份以執行一些測試。至少我不會誤解UPDATE應該做什麼。以爲我失去了陰謀。如果我找到原因,我會更新問題。 – KEW

+2

CTE(或子查詢)在這裏真的有必要嗎?將不可能做'UPDATE TOP(1000)TBL_HISTORY 設置細節=更換(細節,'和QUOT','Times New Roman') 細節如'%&QUOT%'? – cars10m

+0

@ cars10m語法也是有效的 –