在批量插入期间维护运行变量

时间:2015-02-14 01:58:10

标签: sql sql-server sql-server-2008

我有一个执行批量插入的存储过程。其中一列填充了需要使用先前插入的行的值计算的值,或者如果这是第一次插入则使用默认值。

如何在SQL Server中完成此操作?

我正在努力实现的一个例子:

INSERT INTO [my_table] ([other_id], [some_date])
SELECT [id], fn_get_next_valid_time(<previously_inserted_date>)
FROM [other_table]

1 个答案:

答案 0 :(得分:1)

已经问了很多关于跑步总数的问题,我假设你不只是想把数字加起来。但是,你仍然可以使用自我加入和分组来获得你需要的东西,最后的答案here恰好是我看到的第一个说明技术的答案。你需要设计一个能用这种方法表达前一个数字的公式。

如果乘以8是您实际尝试的操作,则可以使用ROW_NUMBERPOWER,假设默认值为1:

INSERT INTO [my_table]([other_id], [number])
SELECT [id], POWER(8, ROW_NUMBER() OVER (ORDER BY [id]) - 1) AS [Num]
FROM [other_table]

如果你有SQL Server 2012+,你可以使用LAG功能:

INSERT INTO [my_table]([other_id], [number])
SELECT [id], LAG(Num, 1, 1) OVER (ORDER BY [id])
FROM [other_table]

修改

根据评论,我认为这应该可以解决问题,只要一小时内安排的内容不超过12件。而且我确信有一种更好的方法可以将该小时转换为time。我没有方便我的服务器测试。

INSERT INTO [my_table]([other_id], [other_time])
SELECT [id], 
    DATEADD(mi, 
       5 * (ROW_NUMBER() OVER (PARTITTION BY [hour_to_schedule] ORDER BY [id]) - 1),
       CAST(CAST([hour_to_schedule] AS VARCHAR(2)) + ':00:00' AS TIME))
FROM [other_table]