比光标tsql更好

时间:2012-09-28 19:15:18

标签: sql-server tsql cursor

这里的问题很简单(尽管我已准备好回答不是),我怎样才能使这个查询更有效率。

简而言之,它复制记录。它选择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

1 个答案:

答案 0 :(得分:1)

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