0

ストアド プロシージャから結果を取得するためにカーソルを使用したいと考えています。次のストアド プロシージャを参照してください。

CREATE PROCEDURE Test
@ID INT
AS 
BEGIN

        DECLARE @Name VARCHAR(400);
        DECLARE ACursor CURSOR FOR EXEC AStoredProcedure @ID

    OPEN ACursor;
    FETCH NEXT FROM ACursor INTO @Name;

        WHILE @@FETCH_STATUS = 0
        BEGIN
            PRINT @NAME
        END
    CLOSE ACursor;
    DEALLOCATE ACursor;

END

これでエラーが発生しました。でも、こんな風に使いたい。これどうやってするの?

PS。ストアド プロシージャの EXEC ステートメントを INSERT できません。ストアド プロシージャは既にこのステートメントを使用しており、このストアド プロシージャを変更したくないためです。

4

2 に答える 2

0

@ID のデータ型を指定する必要があります おそらく @ID INT

于 2012-08-09T03:49:41.110 に答える
0

ループ内で次の行を取得するのを忘れました:

CREATE PROCEDURE Test
@ID INT
AS 
BEGIN

        DECLARE @Name VARCHAR(400);
        DECLARE ACursor CURSOR FOR EXEC AStoredProcedure @ID

    OPEN ACursor;
    FETCH NEXT FROM ACursor INTO @Name;

        WHILE @@FETCH_STATUS = 0
        BEGIN
            PRINT @NAME
            FETCH NEXT FROM ACursor INTO @Name;
        END
    CLOSE ACursor;
    DEALLOCATE ACursor;

END

これは次のように書き換える必要があります。

    OPEN ACursor;
    WHILE 1 = 1
    BEGIN
        FETCH NEXT FROM ACursor INTO @Name;

        IF @@FETCH_STATUS <> 0
        BEGIN
            BREAK
        END
        PRINT @NAME
    END
    CLOSE ACursor;
    DEALLOCATE ACursor;

fetchこの方法では、コードに 1 つしかありません。これを忘れるのは簡単ではありません。また、カーソルクエリに追加された列を各フェッチに個別に追加する必要もありません。

カーソルは悪ですが、時には必要です。それらを高速化するにはfast_forwardstaticキーワードを使用localし、コードのエラーによってカーソルが開いたままにならないようにします。

于 2012-08-09T08:03:07.670 に答える