私のコードによれば、cursor
を使用してWInstance
の情報をすべて取得していました。ただし、cursor
のため、クエリにのパフォーマンスの問題がある可能性があります。 cursor
の代わりに入れ子選択を使用する方法はありますか?あなたのアイデアを教えてください。ここSQLスクリプトを短縮する方法
私のビジネスはわずか1と同じItemID
、SequenceID
、TaskStatus
、ListID
、WebID
、SiteID
のを取得することです。
技術は、たくさんある同じItemID
、SequenceID
、TaskStatus
、ListID
、WebID
、SiteID
WInstance
の接合テーブルおよびAssignTask = 'Assign task'
とWProgress
。したがって、私はdistinct
とcursor
をループスルーして、先頭の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;
トピックオプティマイザに問題が発生するため、トピックの説明はほとんどありませんが、@ TempTableStatusのようなテーブル変数を使用することは一般的に好ましくありません。テンポラリテーブル '#TempTableStatus'で置き換えることもできます。それだけではまともなパフォーマンスが得られるかもしれません。 – Nisarg
お世話になりました。それは私のコードで変更されるものです。どのように 'カーソル'について?カーソルを使用せずに照会することは不可能ですか? –
カーソルを置き換えるためのサブクエリを作成できるようです。この場合、カーソルが問題であるかどうかはわかりません。 – Nisarg