-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

如果您使用 OUTPUT 子句而不是询问 scope_identity,则根本不需要使用游标。您将把这些信息放入一个表变量中。您还希望在输出子句中返回唯一标识记录的任何其他列,以便您可以在连接中使用它们来获取后续插入所需的数据。

于 2012-09-28T19:21:58.513 回答