0

すでに Google で検索しましたが、質問に対する回答が見つかりませんでした。インターネットでは、すべてが私が正しいと言っています。私の問題は-今のところ、カーソルに保存した値を書き込もうとしています(はい、それだけです)。ただし、私が使用するループは無限大であり、カーソルからすべての値を最初から最後まで、何度も何度も書き込みます...

CREATE PROCEDURE CreateOrEditClient(...Parameters...) AS
DECLARE c CURSOR FOR SELECT column FROM table;
DECLARE @wrt VARCHAR(20);
DECLARE @tmp INT = 0;
 BEGIN
  OPEN c;
   FETCH NEXT FROM c INTO @wrt;
    WHILE @@FETCH_STATUS = 0
     BEGIN
      print CAST(@tmp AS VARCHAR(10)) + '  ' + @wrt;
      SET @tmp = @tmp +1;
      FETCH NEXT FROM c INTO @wrt;
     END;
  CLOSE c;
  DEALLOCATE c;
END;

EXEC CreateOrEditClient ...;

私の意見では、カーソルは正しく書かれていますが、出力は次のとおりです。

0  790710/1112
1  900519/5555
2  790716/7877
....
19 111111/1111
0  790710/1112
1  900519/5555
....

そして最後に、「ストアド プロシージャ、関数、トリガー、またはビューの最大ネスト レベルを超えました (制限 32)」というエラー メッセージが書き込まれます。

私が使うだけなら

SELECT column FROM table;

20 レコードのみを書き込みます。

この例にはもっと良い解決策があることは知っていますが、カーソルが機能しない理由を知る必要があります。将来役に立つかもしれません。回答ありがとうございます。

4

4 に答える 4

1

わかりました、質問中のコメントは解決策です。

"EXEC プロシージャ名 ...;" コンパイル時に、プロシージャの本体と同じファイルにすることはできません。

CREATE PROCEDURE CreateOrEditClient(...Parameters...) AS
DECLARE c CURSOR FOR SELECT column FROM table;
DECLARE @wrt VARCHAR(20);
DECLARE @tmp INT = 0;
 BEGIN
  OPEN c;
   FETCH NEXT FROM c INTO @wrt;
    WHILE @@FETCH_STATUS = 0
 BEGIN
  print CAST(@tmp AS VARCHAR(10)) + '  ' + @wrt;
    SET @tmp = @tmp +1;
    FETCH NEXT FROM c INTO @wrt;
 END;
  CLOSE c;
  DEALLOCATE c;
END;

問題の例は、プロシージャを再帰的に呼び出します。ありがとうございます。

于 2013-05-03T20:52:04.527 に答える
0

コードを正しくインデントしておくと、おそらく気付くでしょう。あなたが持っている:

CREATE PROCEDURE CreateOrEditClient(...Parameters...) AS
DECLARE c CURSOR FOR SELECT column FROM table;
DECLARE @wrt VARCHAR(20);
DECLARE @tmp INT = 0;
BEGIN
    OPEN c;
        FETCH NEXT FROM c INTO @wrt;
        WHILE @@FETCH_STATUS = 0
        BEGIN
            print CAST(@tmp AS VARCHAR(10)) + '  ' + @wrt;
            SET @tmp = @tmp +1;
            FETCH NEXT FROM c INTO @wrt;
        END;
    CLOSE c;
    DEALLOCATE c;
END;

あなたが持っている必要があります:

CREATE PROCEDURE CreateOrEditClient(...Parameters...) AS
BEGIN
    DECLARE @wrt VARCHAR(20);
    DECLARE @tmp INT = 0;
    DECLARE c CURSOR FOR SELECT column FROM table;
    OPEN c;
        FETCH NEXT FROM c INTO @wrt;
        WHILE @@FETCH_STATUS = 0
        BEGIN
            print CAST(@tmp AS VARCHAR(10)) + '  ' + @wrt;
            SET @tmp = @tmp +1;
            FETCH NEXT FROM c INTO @wrt;
        END;
    CLOSE c;
    DEALLOCATE c;
END;

EXEC CreateOrEditClient ...;

ところで。あなたのコードは実行されましたか? 私には構文エラーのようです。

編集:ああ、パラメーターは括弧内で宣言されていません。例えば:

CREATE PROCEDURE tmp_mol_cleanup_db
    @param1 type,
    @param2 type
AS
BEGIN
    -- procedure body
END;
于 2013-05-03T10:33:09.787 に答える
0

使用する

 DECLARE @tmp INT
 SET @tmp=0

代わりに DECLARE @tmp INT = 0

于 2013-05-03T12:59:18.003 に答える
0

これを試してください...

BEGIN
    SET NOCOUNT ON ;
    DECLARE @wrt VARCHAR(20)
    DECLARE @tmp INT = 0

    DECLARE Cur_Common CURSOR  FAST_FORWARD READ_ONLY FOR   
    SELECT iID FROM 'YourTable'
    OPEN Cur_Common
    FETCH NEXT FROM Cur_Common INTO @wrt

    WHILE @@FETCH_STATUS = 0 
        BEGIN
            print CAST(@tmp AS VARCHAR(10)) + '  ' + @wrt;
SET @tmp = @tmp +1;

       FETCH NEXT FROM Cur_Common INTO @wrt
        END
        CLOSE Cur_Common
    DEALLOCATE Cur_Common
END
于 2013-05-03T10:36:06.840 に答える