2017-11-26 12 views
0

私のコードによれば、cursorを使用してWInstanceの情報をすべて取得していました。ただし、cursorのため、クエリにのパフォーマンスの問題がある可能性があります。 cursorの代わりに入れ子選択を使用する方法はありますか?あなたのアイデアを教えてください。ここSQLスクリプトを短縮する方法

私のビジネスはわずか1と同じItemIDSequenceIDTaskStatusListIDWebIDSiteIDのを取得することです。

技術は、たくさんある同じItemIDSequenceIDTaskStatusListIDWebIDSiteIDWInstanceの接合テーブルおよびAssignTask = 'Assign task'WProgress。したがって、私はdistinctcursorをループスルーして、先頭の1だけをorder byで取得しました。あなたは、カーソルを使用する必要はありません

CREATE PROCEDURE dbo.CustomTasksHistory 
    (
     @Username NVARCHAR(255) 
    ) 
AS 
    DECLARE @TempTableStatus TABLE 
     (
      ItemID INT , 
      SequenceID INT , 
      TaskStatus NVARCHAR(25) , 
      ListID UNIQUEIDENTIFIER , 
      WebID UNIQUEIDENTIFIER , 
      SiteID UNIQUEIDENTIFIER 
     ); 

    DECLARE @ItemID INT; 
    DECLARE @SequenceID INT; 
    DECLARE @ListID UNIQUEIDENTIFIER; 
    DECLARE @WebID UNIQUEIDENTIFIER; 
    DECLARE @SiteID UNIQUEIDENTIFIER; 
    DECLARE @AssignTask VARCHAR(25); 
    SET @AssignTask = 'Assign task'; 

    -- Select final TaskStatus of each ItemID with its SequenceID -- 
    DECLARE cursor_ItemID CURSOR FAST_FORWARD READ_ONLY FOR 
     SELECT DISTINCT 
       WI.ItemID , 
       WP.SequenceID , 
       WI.ListID , 
       WI.WebID , 
       WI.SiteID 
     FROM dbo.WInstance WI 
       INNER JOIN dbo.WProgress WP ON WI.InstanceID = WP.InstanceID 
     WHERE WP.CurrentActivityTitle = @AssignTask; 

    OPEN cursor_ItemID; 

    FETCH NEXT FROM cursor_ItemID INTO @ItemID, @SequenceID, @ListID, @WebID, @SiteID; 

    WHILE @@FETCH_STATUS = 0 
     BEGIN 
      INSERT INTO @TempTableStatus 
        (ItemID , 
         SequenceID , 
         TaskStatus , 
         ListID , 
         WebID , 
         SiteID 
        ) 
        SELECT TOP 1 
          WI.ItemID , 
          WP.SequenceID , 
          CASE WHEN WP.ActivityComplete = 0 
           THEN 'Not Started' 
           ELSE 'Completed' 
          END AS 'TaskStatus' , 
          WI.ListID , 
          WI.WebID , 
          WI.SiteID 
        FROM dbo.WInstance WI 
          INNER JOIN dbo.WProgress WP ON WI.InstanceID = WP.InstanceID 
        WHERE WP.CurrentActivityTitle = @AssignTask 
          AND WI.ItemID = @ItemID 
          AND WP.SequenceID = @SequenceID 
          AND WI.ListID = @ListID 
          AND WI.WebID = @WebID 
          AND WI.SiteID = @SiteID 
        ORDER BY TimeStamp DESC; 

      FETCH NEXT FROM cursor_ItemID INTO @ItemID, @SequenceID, @ListID, @WebID, @SiteID; 
     END; 

    CLOSE cursor_ItemID; 
    DEALLOCATE cursor_ItemID; 

    SELECT * 
    FROM @TempTableStatus; 
+1

トピックオプティマイザに問題が発生するため、トピックの説明はほとんどありませんが、@ TempTableStatusのようなテーブル変数を使用することは一般的に好ましくありません。テンポラリテーブル '#TempTableStatus'で置き換えることもできます。それだけではまともなパフォーマンスが得られるかもしれません。 – Nisarg

+0

お世話になりました。それは私のコードで変更されるものです。どのように 'カーソル'について?カーソルを使用せずに照会することは不可能ですか? –

+0

カーソルを置き換えるためのサブクエリを作成できるようです。この場合、カーソルが問題であるかどうかはわかりません。 – Nisarg

答えて

0

は、ここに私のコードです。クエリを以下のように置き換えます。

+0

ありがとうございます。しかし、コードは機能していないようです。コードをもっと分かりやすくするためにビジネスを追加しました。あなたはそれを一目で分かりますか? –

+0

あなたは 'does not work'に関するより多くの情報を提供する必要があります。構文エラーですか?クエリ結果が間違っていますか? – Squirrel

+0

'ORDER BY TimeStamp DESC'に' TimeStamp'がないため、クエリが機能しません。内部の 'SELECT'クエリに' TimeStamp'を追加して、結果が正しくないようにしました。 (このコードは 'distinct by' order by'を使わないですべての項目を取得するためのものです。 –

関連する問題