WHERE
問題は、更新クエリから句が欠落しているため、各ループがすべての行を更新していることです。そのはず:
UPDATE sheet1$
SET new_id = @no1
WHERE New_ID = @No -- ONLY UPDATE 1 ROW
余談ですが、SQL-Serverタグが正しいと仮定すると、ROW_NUMBER()
関数を使用してカーソルなしでこれを行うことができます
WITH CTE AS
( SELECT New_ID, [RN] = ROW_NUMBER() OVER(ORDER BY New_ID)
FROM yourTable
)
UPDATE CTE
SET New_ID = RN
編集 - 説明
ROW_NUMBER は一連の数字を提供するだけで、Common Table Expressionは動的ビューのようなものです。
If you run:
WITH CTE AS
( SELECT New_ID, [RN] = ROW_NUMBER() OVER(ORDER BY New_ID)
FROM yourTable
)
SELECT *
FROM CTE
CTE内で何が行われているのかをよりよく理解する必要があります。CTEの利点は、元のテーブルを参照しなくても直接更新できることです。したがって、CTEの更新は次のようになります。
UPDATE yourTable
SET New_ID = RN
FROM yourTable
INNER JOIN
( SELECT New_ID, [RN] = ROW_NUMBER() OVER(ORDER BY New_ID)
FROM yourTable
) n
ON n.New_ID = yourTable.New_ID;