在批量插入期间维护 运行 变量
Maintaining a running variable during a batch insert
我有一个执行批量插入的存储过程。其中一列正在填充需要使用先前插入的行的值计算的值,或者如果这是第一次插入则使用默认值。
如何在 SQL 服务器中完成此操作?
我正在尝试完成的示例:
INSERT INTO [my_table] ([other_id], [some_date])
SELECT [id], fn_get_next_valid_time(<previously_inserted_date>)
FROM [other_table]
运行 总数已被问到很多,我假设您不只是想对数字求和。但是,您仍然可以使用自联接和分组来获得所需的内容,最终答案 here 恰好是我看到的第一个说明该技术的答案。您确实需要设计一个可以用这种方法表达先前数字的公式。
如果乘以 8 是您实际要执行的操作,您可以使用 ROW_NUMBER
和 POWER
,假设默认值为 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]
我有一个执行批量插入的存储过程。其中一列正在填充需要使用先前插入的行的值计算的值,或者如果这是第一次插入则使用默认值。
如何在 SQL 服务器中完成此操作?
我正在尝试完成的示例:
INSERT INTO [my_table] ([other_id], [some_date])
SELECT [id], fn_get_next_valid_time(<previously_inserted_date>)
FROM [other_table]
运行 总数已被问到很多,我假设您不只是想对数字求和。但是,您仍然可以使用自联接和分组来获得所需的内容,最终答案 here 恰好是我看到的第一个说明该技术的答案。您确实需要设计一个可以用这种方法表达先前数字的公式。
如果乘以 8 是您实际要执行的操作,您可以使用 ROW_NUMBER
和 POWER
,假设默认值为 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]