2017-06-12 7 views
1

私が実行しているUPDATE/REPLACEの動作を理解しようとしています。無効なデータを削除し、優先するデータに置き換えています。TSQL - 予想より多くの行に影響を及ぼす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

唯一の方法です。それ以外の場合は、 'HISTORYID'が一意である場合、影響を受ける可能性のある行は1000以上ありません。 –

+0

上記を 'SELECT'文にすると返される行数はいくつですか?私はHISTORYIDがユニークではないと思っています... – Shaneis

+0

@Shaneis:HISTORYIDはPKです.OPごとに一意でなければなりません。 –

答えて

1

代わりにこれを試してください(高速です)。それでも1000行を更新すると、それはトリガーによるものです。 1000行を更新する場合、HISTORYIDは主キー(複合主キー)の唯一の列ではありません。 `SET NOCOUNT on`のが含まれていませんでしたテーブル上のトリガがあった場合、私はこれが可能で見ることができた

;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までは、間違いなく1つの列キーであり、テーブルにトリガーはありません。いくつかのテストを実行するために、データベースの「pre-fix」の1つのバックアップを復元します。少なくとも私は、更新が何をすべきか誤解しているわけではありません。私はプロットを失っていたと思った。私が理由を見つけたら、私はその質問を更新するでしょう。 – KEW

+2

CTE(またはサブクエリ)は本当に必要ですか? 'UPDATE TOP(1000)TBL_HISTORY SET DETAILS = REPLACE(DETAILS、'&QUOT '、' Times New Roman ') WHERE DETAILS LIKE'%&QUOT% ''は実行できませんか? – cars10m

+0

@ cars10mその構文も有効です –

関連する問題