TSQL – SELECT TOP et UPDATE affectant plus de lignes que prévu

J'essaye de comprendre le comportement d'un UPDATE/REPLACE que UPDATE/REPLACE qui enlève des données non valides et les remplace par des données préférées.

Le UPDATE s'exécute normalement et fait ce qu'il doit faire, mais les lignes affectées ne sont pas ce que je m'attendais dans certains cas (je le réalise sur plusieurs bases de données).

J'ai mis une partie du script ci-dessous (le rest est essentiellement la réplication de la même fonction sur plusieurs tables)

 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 

Ce que j'imagine arriver avec le script ci-dessus est de sélectionner les TOP 1000 TBL_HISTORY loggings dans TBL_HISTORY qui contiennent la string de données non désirée et effectuer le REPLACE .

Le résultat a été dans les cas où il y a plus de 1000 lignes affectées, il les mettra toutes à jour, renvoyant une valeur de 1068 lignes affectées par exemple.

HISTORYID est le PK sur la table. Est-ce que je ne comprends pas comment cela devrait fonctionner? Toute orientation serait appréciée.

Essayez ceci à la place (c'est plus rapide). S'il met encore à jour plus de 1000 lignes, cela est dû à un triggersur. Si elle met à jour 1000 lignes, HISTORYID n'est pas la seule colonne de la key primaire (key primaire composite).

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