SQL Server 我必须为几个日期运行一个存储过程,但是参数一次只取一个日期,而不是一个范围,我可以循环它吗?如果可以,如何循环?

von4xj4u  于 2022-11-21  发布在  其他
关注(0)|答案(1)|浏览(119)

我有一组存储过程(在MS SQL中)要运行-需要获取一个参数,一个日期,但它只记录了以这种方式运行它:

USE SALES
DECLARE @datestamp datestamp = '2022-11-01' 
Exec Tool_UpdateCash @datestamp = @datestamp 
Exec Tool_UpdateNumbers @datestamp = @datestamp

因此,如果我现在需要运行整个11月,我会在每次成功运行后手动增加日期。
(The原因是1号的更新中有一个bug,我已经部署了一个修复程序,但是销售的阅读需要更正/更新)
有没有更有效的方法可以在一个日期范围内执行此操作?我可以将**日期戳设置在@datestamp与dateadd(day,14,@datestamp)**之间吗
(for运行它14次?)或像这样:

日期戳(2022年11月1日,2022年11月2日,2022年11月3日,2022年11月4日,2022年11月5日,2022年11月6日,2022年11月7日,2022年11月8日,2022年11月9日,2022年11月10日,2022年11月11日)'2022年11月12日','2022年11月13日','2022年11月14日')

我更喜欢如果第一个建议的作品,但第二个也是可能的,那么我至少可以只是复制和粘贴它..其他更好的建议也是受欢迎的,并提前感谢任何帮助
我已经以记录在案的方式运行了它,我害怕以任何其他方式运行它,因为我不想导致问题,所以我试图确认其他方式来运行几天而不会捏造一些东西
编辑:pr的反馈和我自己的tweaks我降落在这个解决方案:

USE VARESALG
DECLARE @datestart date = '2022-11-01'

WHILE ( @datestart < dateadd(day, 14, @datestart ) )
BEGIN
Exec Tool_UpdateCash @datestamp = @datestamp 
Exec Tool_UpdateNumbers @datestamp = @datestamp
SET @datestart = DATEADD(day,1,@datestart) 
END

然而,这是完全错误的-因为它已经运行了5个多小时。它不应该需要5个小时。该死的

6mzjoqzu

6mzjoqzu1#

如果不能重写存储过程以接受日期,则只能在循环中为每个日期调用它们,使用CURSOR或WHILE循环。

DECLARE @datestamp date = '2022-11-01' 

WHILE (@datestamp < '2022-11-15') 
BEGIN   
  --PRINT @datestamp
  Exec Tool_UpdateCash @datestamp = @datestamp    
  Exec Tool_UpdateNumbers @datestamp = @datestamp   
  SET @datestamp = dateadd(day, 1, @datestamp) 
END

假设@datestamp是DATE/DATETIME类型。

相关问题