TSQL - SELECT TOP和UPDATE影响比预期更多的行

时间:2017-06-12 10:54:41

标签: sql-server tsql

我试图了解我执行的UPDATE/REPLACE的行为,即删除一些无效数据并替换为首选数据。

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 个答案:

答案 0 :(得分: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')