【问题标题】:While Loop FuctionWhile 循环函数
【发布时间】:2021-12-03 21:59:06
【问题描述】:

我有这个问题

 select         
 Suc,       
 SKU,       
 TipoMov,       
 Prov,      
 sum(Uni) as Uni, sum(Imp_Vta) as Imp_Vta 
 into #Mov 
 from dual where (Mes between 22009 and 22105) 
 and        Suc = 11 
 and        TipoMov in (4,5,8)
 and        Id_Fec_Diaria between '2020-09-28' and '2021-05-17' 
 group by 
 Suc,       SKU,        TipoMov,        Prov

我正在尝试在两个日期之间做一个 while 循环 到目前为止,我有这个,但有一个错误我无法修复或理解。

declare
@FechaMin DATE='2020-09-28',
@FechaMax DATE='2021-05-17';

while (@FechaMin >= @FechaMax)
begin 
        select 
        suc,
        SKU,
        TipoMov,
        Prov,
        sum(Uni) as Uni,
        sum(Imp_Vta) as Imp_Vta
into #Mov
from dual
where (Mes between 22009 and 22105) and
        Suc = 11 and
        TipoMov in (4,5,8) and
        Id_Fec_Diaria >= @FechaMin and Id_Fec_Diaria< @FechaMax
group by 
        suc,
        SKU,
        TipoMov,
        prov) END

感谢您的帮助。

【问题讨论】:

  • 你的while循环什么时候结束?您如何确保它不会永远运行?
  • 你为什么要使用WHILE? SQL 是一种基于集合的语言,您最不想使用的是迭代解决方案。
  • 你不能在这样的循环中使用select ... into。该语句创建表#Mov,因此在下一次迭代中您将收到错误,因为该表已存在。
  • 另外,SQL Server 2008 已经完全不受支持超过 2 年了;很久以前就已经对您的升级路径进行了排序。
  • 选择from dual,确定不是Oracle?

标签: sql tsql for-loop sql-server-2008 while-loop


【解决方案1】:

如果我没记错你的目的,你必须使用光标来实现你的目标。

您可以使用以下代码替换您的 while 块:

DECLARE 
    @Suc VARCHAR(MAX), 
    @SKU   VARCHAR(MAX),
    @TipoMov VARCHAR(MAX),
    @Prov VARCHAR(MAX)

DECLARE Mycursor CURSOR
FOR SELECT 
         Suc , 
         SKU ,
         TipoMov,
         Prov 
    FROM 
        dual where (Mes between 22009 and 22105) 
 and        Suc = 11 
 and        TipoMov in (4,5,8)
 and        Id_Fec_Diaria between '2020-09-28' and '2021-05-17'

OPEN Mycursor;

FETCH NEXT FROM Mycursor INTO 
    @Suc , 
    @SKU   ,
    @TipoMov ,
    @Prov ;

WHILE @@FETCH_STATUS = 0
    BEGIN
        -----Your Specific Code
        FETCH NEXT FROM Mycursor INTO 
             @Suc , 
             @SKU   ,
             @TipoMov ,
             @Prov ;
    END;

CLOSE Mycursor;

DEALLOCATE Mycursor;

【讨论】:

    猜你喜欢
    • 2021-01-14
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    • 2023-03-16
    • 2017-06-07
    • 2021-03-08
    • 2016-07-23
    • 2016-11-27
    相关资源
    最近更新 更多