-1

ここでの質問は単純です (答えがそうでないことを覚悟していますが)、このクエリをより効率的にするにはどうすればよいでしょうか。

簡単に言えば、レコードをコピーします。X レコードを選択し、それらのレコード データを使用して複製し、新しい識別子を取得します。元のレコードと新しいレコードの ID を使用して、新しい識別子を使用して別のテーブルの元のデータのデータをコピーして挿入します。

これには長い時間がかかります。短くするのを手伝ってくれませんか?

DECLARE DaysToDuplicateCursor CURSOR FAST_FORWARD FOR 
SELECT 
    DayId 
FROM [Days] 
WHERE AgentId IN ('XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX') 
AND PersonAgentId IN (
     'YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY'
    ,'WWWWWWWW-WWWW-WWWW-WWWW-WWWWWWWWWWWW'
    ,'ZZZZZZZZ-ZZZZ-ZZZZ-ZZZZ-ZZZZZZZZZZZZ'
    ,'TTTTTTTT-TTTT-TTTT-TTTT-TTTTTTTTTTTT'
)

DECLARE @Id INT

OPEN DaysToDuplicateCursor
    FETCH NEXT FROM DaysToDuplicateCursor INTO @Id
    WHILE @@FETCH_STATUS = 0
    BEGIN
        --
        -- Insert Days data.
        --
        INSERT INTO [Days] (
               [DayTemplateId]
              ,[DayDate]
        )
        SELECT [DayTemplateId]
              ,DATEADD(YEAR,-1,[DayDate]) AS [DayDate]
          FROM [Days] WHERE [DayId] = @Id
        --
        -- Insert Periods data.
        --
        INSERT INTO [Periods] (
           [DayId]
          ,[PeriodTemplateId]
        )
        SELECT 
           SCOPE_IDENTITY()
          ,[PeriodTemplateId]
        FROM [Periods] WHERE [DayId] = @Id
        --
    END
CLOSE DaysToDuplicateCursor
DEALLOCATE DaysToDuplicateCursor
4

1 に答える 1

1

scope_identity を要求する代わりに OUTPUT 句を使用する場合は、カーソルを使用する必要はまったくありません。この情報をテーブル変数に入れます。また、レコードを一意に識別するその他の列を出力句で返すこともできます。これにより、それらの列を結合で使用して、後続の挿入で必要なデータを取得できます。

于 2012-09-28T19:21:58.513 に答える