0

ストアド プロシージャにカーソルがありました。より高速に実行するために while ループに更新しました。しかし、私のwhileループには同じ時間がかかります。スクリプトのデバッグを手伝ってください。以下のコードを見つけてください。

Cursor を更新して、MS SQL でベース演算子 Query を設定するのに助けが必要です。

DECLARE @orderArray INT
    ,@LeftTSMKEY NVARCHAR(250)
    ,@ListElid NVARCHAR(250)
    ,@ListType NVARCHAR(250)
    ,@ListType_Prev NVARCHAR(250)

SET @ListType_Prev = ''
SET @inc = 0

DECLARE cursql CURSOR
FOR
SELECT ListElid
    ,ListType
    ,orderArray
    ,LeftTSMKEY
FROM QAT_ListElid
ORDER BY ListType
    ,orderArray

OPEN cursql

FETCH NEXT
FROM cursql
INTO @ListElid
    ,@ListType
    ,@orderArray
    ,@LeftTSMKEY

WHILE (@@Fetch_status = 0)
BEGIN
    IF @ListType <> @ListType_Prev
    BEGIN
        SET @inc = 0
        SET @ListType_Prev = @ListType
    END
    ELSE IF @ListType = @ListType_Prev
    BEGIN
        SET @inc = @inc + 1
    END

    IF @inc <> @orderArray
    BEGIN
        INSERT [QAT_ListElid2] (
            [ListElid]
            ,[ListType]
            ,[orderArray]
            ,[LeftTSMKEY]
            )
        VALUES (
            @ListElid
            ,@ListType
            ,@inc
            ,@LeftTSMKEY + CAST(@inc AS NVARCHAR(10)) + ']'
            )
    END

    FETCH NEXT
    FROM cursql
    INTO @ListElid
        ,@ListType
        ,@orderArray
        ,@LeftTSMKEY
END

CLOSE cursql

DEALLOCATE cursql

以下のサンプルデータをご覧ください

ここに画像の説明を入力

ListElid    ListType    orderArray  LeftTSMKEY
1000:odl5:7pt_ToxAcuDo[0]   1000:odl5:7pt_ToxAcuDo  0   ToxAcuDo[
106i:odl5:7pt_ToxAcuDo[0]   106i:odl5:7pt_ToxAcuDo  0   ToxAcuDo[
107:107:7pt_NIL[0]  107:107:7pt_NIL 0   NIL[
107:1827:7pt_NIL[0] 107:1827:7pt_NIL    0   NIL[
107:1827:7pt_NIL[1] 107:1827:7pt_NIL    1   NIL[
107:1827:7pt_NIL[3] 107:1827:7pt_NIL    3   NIL[
107:1hqn:7pt_NIL[0] 107:1hqn:7pt_NIL    0   NIL[
107:1hqn:7pt_NIL[1] 107:1hqn:7pt_NIL    1   NIL[
107:1rj7:7pt_NIL[0] 107:1rj7:7pt_NIL    0   NIL[
107:1rj7:7pt_NIL[1] 107:1rj7:7pt_NIL    1   NIL[
107:1rsg:7pt_NIL[0] 107:1rsg:7pt_NIL    0   NIL[
107:1s2r:7pt_NIL[0] 107:1s2r:7pt_NIL    0   NIL[
107:1s2r:7pt_NIL[1] 107:1s2r:7pt_NIL    1   NIL[
107:1s2r:7pt_NIL[2] 107:1s2r:7pt_NIL    2   NIL[
107:1s2r:7pt_NIL[4] 107:1s2r:7pt_NIL    4   NIL[
107:1vf:7pt_ NIL[0] 107:1vf:7pt_NIL    0    NIL[
4

2 に答える 2

0

これらは DECLARE CURSOR 構文に基づいており、主に Transact-SQL スクリプト、ストアド プロシージャ、およびトリガーで使用されます。Transact-SQL カーソルはサーバーに実装され、クライアントからサーバーに送信される Transact-SQL ステートメントによって管理されます。また、バッチ、ストアド プロシージャ、またはトリガーに含まれている場合もあります。

やその他のデータ型と同様INTVARCHAR、カーソルは T-SQL バッチで宣言されます。SQL Server には、それを管理するための関連する手順が付属しています。

  1. OPEN は、クエリを実行してカーソルに結果セットを設定するように SQL Server に指示します。

  2. CLOSE は SQL Server にカーソルが使用するリソースを解放するよう指示します。

  3. FETCH を使用して、カーソルから特定の行を取得するように SQL Server に指示します。この関数を使用すると、 @@FETCH_STATUS 変数で FETCH 命令の結果を取得できます。0 に設定されている場合、これは命令が成功したことを意味します。

于 2020-02-03T07:00:59.250 に答える