web-dev-qa-db-ja.com

カーソル行の設定コマンド

私はsqlserverを初めて使用し、t-sqlカーソルについて学習しています。

「t-sqlユーザーガイド」という本でカーソル宣言の例を見てきました。

フェッチごとにより多くの行を返すコマンドがあります。

set cursor rows 3 for authors_crsr

Sqlserver2012で試しましたが、機能しませんでした。グーグルで検索してみましたが、うまくいきませんでした。

このコマンドの何が問題になっていますか?たぶん、このコマンドは私が使用しているバージョンから削除されていますか? (2012)

ありがとうございました。

1
andrea

他の人がコメントしているように、このコマンドはSQLサーバーコマンドではありません。ただし、3行を3つの異なる変数セットにフェッチする必要がある場合は、次を使用してフェッチできます。

FETCH ABSOLUTE 1 FROM cursor_name INTO @Variable1;

FETCH ABSOLUTE 3 FROM cursor_name INTO @Variable3;

FETCH ABSOLUTE 2 FROM cursor_name INTO @Variable2;

FETCH ABSOLUTE 1 FROM cursor_name INTO @Variable1;

各FETCHは、常に現在の行をカーソルの位置にリセットすることに注意してください。これには、カーソルを次のように宣言する必要があります:DECLARE cursor_name SCROLL CURSOR FOR ...。ただし、ここで注意してください。これには、カーソル宣言のSQLステートメントにORDER BYが必要であり、それが重要な場合は、期待される順序でカーソルを確実に受け取ることができます。

最後に、カーソルを使用しないように一生懸命努力してください。特にスクロールが必要なもの。彼らは本質的に邪悪で、黒い魂を持っており、あなたが使うたびにエドガー・コッドは彼の墓にひっくり返ります。 OK、それほど悪くはないかもしれませんが、あなたは私が言っていることを理解します:-)

編集:

実際には、ABSOLUTEキーワードの後に​​数字の代わりに変数を使用する方が実装が優れているため、ループは次のようになります。

WHILE @@FETCH_STATUS = 0  
BEGIN
    FETCH ABSOLUTE @Ctr FROM contact_cursor INTO @var1;

    SELECT @Ctr = @Ctr + 2
    FETCH ABSOLUTE @Ctr FROM contact_cursor INTO @var2;

    SELECT @Ctr = @Ctr - 1
    FETCH ABSOLUTE @Ctr FROM contact_cursor INTO @var3;

    SELECT @Ctr = @Ctr - 1
    FETCH ABSOLUTE @Ctr FROM contact_cursor INTO @var1;

    --Increment the counter
    SELECT @Ctr = @Ctr + 1
END
0
blobbles