2017-09-07 52 views
1

私はそれに次のコードを持っていた検査の質問、出くわした:カーソルを使用している間、私は@@FETCH_STATUS = 0を使用する通常@@ FETCH_STATUS <> - 1 AND @@ FETCH_STATUS <> - 2は何を意味しますか?

ALTER FUNCTION fncF2 (@HWStreamIndex int = 0) 
RETURNS nvarchar(max) 
AS 
BEGIN 

    DECLARE @OnSiteGroups AS nvarchar(150) 
    DECLARE @OnSiteGroupDetails AS nvarchar(1000) 
    DECLARE @HWOnSiteGroupIndex AS int 
    DECLARE @OnSiteGroupsTotal AS nvarchar(max) 
    SET @OnSiteGroupsTotal = '' 

    DECLARE cursor1 CURSOR 
    READ_ONLY FOR 
      SELECT 
       HWOnSiteGroupName + '-' AS OnSiteGroups, 
       HWOnSiteGroupIndex 
      FROM 
       HW_STREAM_ONSITE_GROUP 
      WHERE 
       HWStreamIndex = @HWStreamIndex 

    OPEN cursor1 

    FETCH NEXT FROM cursor1 INTO @OnSiteGroups, @HWOnSiteGroupIndex 
    WHILE (@@fetch_status <> -1) 
    BEGIN 
     IF (@@fetch_status <> -2) 
     BEGIN 
      BEGIN 
       SET @OnSiteGroupsTotal = @OnSiteGroupsTotal + @OnSiteGroups + ' -- ' 

       DECLARE cursor2 CURSOR 
       READ_ONLY FOR 
         SELECT 
          ISNULL(HW_MANAGE_METH_CODES.HWMMCode, '') + '_' + 
          CONVERT(nvarchar(20), CONVERT(decimal(12, 2), 
          ISNULL(HW_STREAM_ONSITE_GROUP_DETAILS.PercentProcessed, 0.0) * 100)) + '%' AS OnSiteGroups 
         FROM 
          HW_STREAM_ONSITE_GROUP_DETAILS 
          JOIN HW_STREAM_ONSITE_GROUP 
           ON HW_STREAM_ONSITE_GROUP_DETAILS.HWOnSiteGroupIndex = HW_STREAM_ONSITE_GROUP_DETAILS.HWOnSiteGroupIndex 
          LEFT JOIN HW_MANAGE_METH_CODES 
           ON HW_STREAM_ONSITE_GROUP_DETAILS.HWMMCodeIndex = HW_MANAGE_METH_CODES.HWMMCodeIndex 
         WHERE 
          HW_STREAM_ONSITE_GROUP_DETAILS.HWOnSiteGroupIndex = @HWOnSiteGroupIndex 

       OPEN cursor2 

       FETCH NEXT FROM cursor2 INTO @OnSiteGroupDetails 
       WHILE (@@fetch_status <> -1) 
       BEGIN 
        IF (@@fetch_status <> -2) 
        BEGIN 
         BEGIN 
          SET @OnSiteGroupsTotal = @OnSiteGroupsTotal + @OnSiteGroupDetails + ', ' 
         END 
        END 
        FETCH NEXT FROM cursor2 INTO @OnSiteGroupDetails 
       END 

       CLOSE cursor2 
       DEALLOCATE cursor2 

      END 
     END 
     FETCH NEXT FROM cursor1 INTO @OnSiteGroups, @HWOnSiteGroupIndex 
    END 

    CLOSE cursor1 
    DEALLOCATE cursor1 

    RETURN @OnSiteGroupsTotal 
END 

。私はこのコードがどのように動作するのかを理解しようとしましたが、@@FETCH_STATUS <> -1@@FETCH_STATUS <> -2が全体の実行にどのように影響するのですか?このコードを把握することはできませんでした。

@@FETCH_STATUS <> -1@@FETCH_STATUS <> -2の目的は何ですか?また、この機能の実行手順は何ですか?

+0

[@@ FETCH_STATUS](https://docs.microsoft.com/en-us/sql/t-sql/functions/fetch-status-transact-sql) – Lamak

+1

ドキュメントには、異なる値。 https://docs.microsoft.com/en-us/sql/t-sql/functions/fetch-status-transact-sqlこの機能を無効にすることをお勧めします。ループが必要ないネストされたカーソルを使用しています。 FOR XMLを使用すると、コンマで区切られたリストをより簡単かつ迅速に生成できます。 –

+0

サンプルコードは本当に役に立ちます:) –

答えて

1

としてはMicrosoft Documentationで説明した、4つの可能な@@FETCH_STATUS値は、異なるステータス・メッセージを表す各ある:

  • 0は - FETCHステートメントが成功しました。
  • -1 - FETCHステートメントが失敗したか、行が結果セットを超えました。
  • -2 - フェッチされた行がありません。
  • - カーソルがフェッチ操作を実行していません。

WHILE (@@fetch_status <> -1)限り 最後のカーソルFETCHの文が成功したと行が結果セット内であったとして実行するループを語っています。

IF (@@fetch_status <> -2)この手順を続行する前に、行が存在することを確認しています。

関連する問題