28

トピックのとおりです。Transact-SQL でカーソルの位置を最初にリセットして、テーブル上で再度実行できるようにすることはできますか? 次のコンテキストでリセットしたい:

DECLARE @userID INT
DECLARE user_cursor CURSOR FOR SELECT userID FROM users

WHILE /* some condition */
BEGIN
...

    FETCH NEXT FROM user_cursor INTO @userID

    IF @@FETCH_STATUS = 0
    BEGIN
        /*... here goes the reset of the cursor ...*/
    END

...
END
4

4 に答える 4

39

このように、カーソルをスクロールとして宣言する必要があります

declare c scroll cursor for (select statement); 

次に、いつでも最初に見つけるために、次を使用します

fetch first from c;
于 2013-06-26T10:48:11.377 に答える
22

カーソルの種類を強制的に変更せずに使用できる別のオプションは、単にカーソルを閉じてから再度開くことです。

CLOSE user_cursor
OPEN user_cursor

ただし、それが受け入れられる変更である場合、scrollオプションはリソース使用量の点で安くなります。

于 2013-06-26T10:54:22.200 に答える
1

カーソルによって取得されたデータは変更されません。

静的

カーソルが使用するデータの一時コピーを作成するカーソルを定義します。カーソルに対するすべての要求は、tempdb のこの一時テーブルから応答されます。したがって、ベース テーブルに加えられた変更は、このカーソルに対して行われたフェッチによって返されるデータには反映されず、このカーソルは変更を許可しません。

于 2013-06-26T10:49:22.710 に答える
-5

カーソルループを使用してください...

cursor c_something IS
   select * from somewhere

BEGIN

    for some_row in c_something LOOP
        -- do stuff with some_row.COLUMN;
    END LOOP; -- this closes the cursor for you when it has gone all the way through

    -- do other stuff

    for some_row in c_something LOOP -- opens the cursor again from the top
        -- do stuff with some_row.COLUMN;
    END LOOP;

END;
于 2014-01-29T23:20:48.800 に答える