TSQL - 克隆一天的记录

时间:2016-01-07 14:13:47

标签: sql-server tsql sql-server-2012 sql-server-2014

我正在创建一个拥有大型MSSQL数据库的实验室。 为了简化问题,让我们假设它仅适用于1个表(如果我能找到更好的解决方案,我可以为所有表执行此操作)

我在表格中有1天的数据,比如介于525k到630k之间。我想复制不同日期的数据(创建历史记录)。

我已经尝试了不同的方法,而且我发现它很长。最初这个过程需要91个小时来复制1天...我把它降到16分钟来处理1天(这使得复制一年大约需要91个小时)。我想知道是否有任何工具或某些东西可以复制数据或快速创建历史记录?

这就是我现在所拥有的:

    Declare @iDateCnt int=1,
            @TmpDate datetime,
            @iDate int=365, -- counter to create a years worth of history.
            @DateStart datetime = '2015-12-22'
    Select F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, getdate() as F11
    into #TMP_Table1
    From Table1 where F1 = @DateStart -- Template Day to be duplicated

While @iDateCnt<=@iDate
Begin 
    Set @TmpDate = @DateStart-@iDateCnt
    Delete from Table1 where F1 = @TmpDate
    Insert into Table1 (F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11)
        Select @TmpDate as F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, getdate() as F11
        from #Tmp_Table1

    Drop #Tmp_Table1
End 

2 个答案:

答案 0 :(得分:1)

一次执行一次插入操作总是很慢,特别是对于索引严重的表格。

相反,您应该将此作为单个插入执行,类似于

DECLARE @startDate DATETIME = '2015-12-22'
DECLARE @endDate = DATEADD(days,365, @startDate)

Insert into Table1 (F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11)        
Select F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, getdate() 
FROM Table1 where F1 > @startDate AND F1 <= @endDate

答案 1 :(得分:1)

要将我的评论表达为答案,您首先要创建一个具有日期时间列的表,每个日期都有一行用于克隆数据。我们称之为tblDates。然后,您只需对现有脚本执行此操作:

Select F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, getdate() as F11
into #TMP_Table1
From Table1 where F1 = @DateStart -- Template Day to be duplicated

    Insert into Table1 (F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11)
        Select tblDates.DtColumn as F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, getdate() as F11
        from #Tmp_Table1
        CROSSJOIN tblDates

    Drop #Tmp_Table1
End 

这会在#TMP_Table1中为tblDates中的每一行创建所有数据的副本,tblDates列中的F1日期(您之前所在的位置)使用循环变量)。