1

DriverIDテーブルの列をDriver5000、5001、...に設定したい

この目的のために、私はこのスクリプトを書きます:

use WeighbridgeDB
GO

DECLARE @NewDriverID int;
SET @NewDriverID = 5000;

DECLARE Driver_Cursor CURSOR FOR 
SELECT DriverID FROM Driver
FOR UPDATE;

OPEN Driver_Cursor;

FETCH NEXT FROM Driver_Cursor

WHILE @@FETCH_STATUS = 0
BEGIN
    UPDATE Driver SET DriverID = @NewDriverID WHERE CURRENT OF Driver_Cursor;
    SET @NewDriverID += 1;
    FETCH NEXT FROM Driver_Cursor
END

CLOSE Driver_Cursor;
DEALLOCATE Driver_Cursor;
GO

しかし、Whileループは止まらず、の値@@FETCH_STATUSは常に0です。テーブルなどで更新が発生したため、カーソルが再構築されたと思います。

この状況を修正するにはどうすればよいですか?

ありがとう。

4

2 に答える 2

4

とにかく、これにはカーソルは必要ありません(一般的に言えば、ごくわずかな場合を除いて、TSQLでこれらを回避してください)

WITH T AS
(
SELECT *,
       ROW_NUMBER() OVER (ORDER BY DriverID) + 4999 AS NewDriverID
FROM Driver
)
UPDATE T SET DriverID = NewDriverID
于 2012-07-09T11:44:48.363 に答える
0

次のようにします。

UPDATE Driver
SET
    Driver.DriverID = d.NewDriverID 
FROM
(
    select 
        ROW_NUMBER() Over (ORDER BY DriverID) + 5000 AS NewDriverID,
        Driver.DriverID 
    from Driver 
) AS d
WHERE Driver.DriverID = p.DriverID 

カーソルを使用する理由はほとんどありません。

于 2012-07-09T11:53:34.823 に答える