Sql 使用多个条件创建While循环

Sql 使用多个条件创建While循环,sql,sql-server,tsql,Sql,Sql Server,Tsql,我知道这种类型的程序既不可取,也不高效,但我现在需要这种类型的表格,因为我无法得到对我原来问题()的回答。我找到了这个相关的帖子/答案(),但需要根据我的场景进行调整。由于我只是一个数据查询的家伙,我不知道我在这个whilebegin循环中做了什么,我没能找到我起草它的地方 我和前面文章中的用户处于相同的场景中,我不想创建这种类型的表,但是我没有选项和帮助。我非常希望我能像上面的用户那样得到一些帮助/答案 帮帮我,你是我唯一的希望 我试图为两个日期之间的每个产品代码创建一个每日引用记录,在ROW

我知道这种类型的程序既不可取,也不高效,但我现在需要这种类型的表格,因为我无法得到对我原来问题()的回答。我找到了这个相关的帖子/答案(),但需要根据我的场景进行调整。由于我只是一个数据查询的家伙,我不知道我在这个whilebegin循环中做了什么,我没能找到我起草它的地方

我和前面文章中的用户处于相同的场景中,我不想创建这种类型的表,但是我没有选项和帮助。我非常希望我能像上面的用户那样得到一些帮助/答案

帮帮我,你是我唯一的希望

我试图为两个日期之间的每个产品代码创建一个每日引用记录,在ROWID上循环,直到到达最后一个ROWID整数。它在某个地方被打破了,我只是没有这种编程的经验来找出原因和地点,我试着改变部分来看看它的反应如何,但从来没有成功运行过

我希望专业人士可以简单地看到我在循环中导致它失败的地方,并在日期之间不断迭代,然后在产品表的下一个ROWID上重新启动

    CREATE TABLE FACT_ECODEMONTHLY
        ( 
            STARTDT DATE NOT NULL,
            MONTHEND DATE NOT NULL,
            ECODE VARCHAR (255)
        );

    DECLARE @STARTDT DATE
    DECLARE @ENDDT DATE
    DECLARE @TEMPDT DATE
    DECLARE @START INT
    DECLARE @END INT
    DECLARE @TEMPNO INT
    DECLARE @ROWID INT
    DECLARE @ECODE VARCHAR (255)

    SET @STARTDT = '2017-01-01'
    SET @ENDDT = '2022-12-31'
    SELECT @START = MIN(DE1.ROW_ID), @END = MAX(DE1.ROW_ID) FROM DIM_ECODES DE1 
    SET @ECODE = ( SELECT DE2.ECODE FROM DIM_ECODES DE2 WHERE ROW_ID = @START )

    BEGIN

        WHILE (@STARTDT <= @ENDDT) AND (@START <= @END )
            BEGIN
                SET @TEMPDT = @STARTDT;
                SET @TEMPDT =  DATEADD( DAY , 1 , @TEMPDT)

        WHILE (@START <= @END )
            BEGIN 
                SET @TEMPNO = @START;
                SET @TEMPNO = @TEMPNO + 1

        INSERT INTO FACT_ECODEMONTHLY 
        ( STARTDT ,  MONTHEND , ECODE ) 

                VALUES 
                    ( @STARTDT , EOMONTH(@STARTDT) , @ECODE )

                    IF (@STARTDT <= @ENDDT )
                    BEGIN
                        SET @STARTDT = @TEMPDT
                    END
                    ELSE
                    BEGIN
                        SET @STARTDT = '2017-01-01'
                        SET @ENDDT = DATEADD (DAY , 1 , @STARTDT)
                    END

                    IF (@START <= @END)
                    BEGIN
                        SET @START = @TEMPNO
                    END
                    ELSE
                    BEGIN
                        SET @START = 1
                        SET @END = @START + 1
                    END

            END
            END
    END

查询#1

SELECT *

FROM DIM_ECODES;
ECODE MCODE 来源 行ID Q5142-80 Q5999-571 团队 1. P1DH6- P1DH6- 团队 2. U616Z-051 U520U- 团队 3. 14404-31 14404-31 团队 4. R6980- R6980- 团队 5.
您将获得所有相同的值,因为您使用相同的起始值在每个循环中初始化临时变量。您必须在循环之前初始化它们,并在循环结束时在循环中增加它们

SET @TEMPDT = @STARTDT;
WHILE (@TEMPDT <= @ENDDT)
BEGIN
    SET @TEMPNO = @START;
    WHILE (@TEMPNO  <= @END )
    BEGIN 

        -- execute your query here --

        SET @TEMPNO = @TEMPNO + 1;
    END
    SET @TEMPDT =  DATEADD( DAY , 1 , @TEMPDT)
END
访问数据库时,执行SQL命令总是比执行循环更快

这与示例中的插入顺序不同,但根据定义,表中的记录没有定义的顺序。如果您需要特定的顺序,您必须在查询数据时指定它

SELECT *
FROM FACT_ECODEMONTHLY 
ORDER BY STARTDT, ECODE;

如果您需要与
DIM\u ECODES.ROW\u ID
相同的顺序,那么您也必须将这样一列添加到
FACT\u ECODEMONTHLY
表中。

关于您可能没有得到响应的原因,在另一个问题中有很多数据,但没有一个示例数据在DDL和DML语句中;对于许多用户来说,这可能是一种“关闭”,他们必须将您的文本转换为DML语句,并为表创建DDL语句以将所述数据放入。嘿@Larnu,感谢您提供的这一点信息。我将研究如何做到这一点,一位以110万代表点发表评论的人建议我将其添加为文本表。你有没有可能看到我的循环在这个问题上失败的原因/地方?你不需要为此做任何循环,包括实际的样本数据和期望的结果,有人可以很容易地生成一个更有效的基于集合的解决方案。补充,@Stu。希望这能提供一个答案。太棒了,谢谢你,这让我离进球更近了,但我想我还是错过了一些东西。当我在一个月内运行一个测试时,我确实得到了预期的结果(),但是当我在二次测试中将@End设置为2时,我得到了以下结果:
SET @TEMPDT = @STARTDT;
WHILE (@TEMPDT <= @ENDDT)
BEGIN

    INSERT INTO FACT_ECODEMONTHLY (STARTDT, MONTHEND, ECODE)
    SELECT @TEMPDT, EOMONTH(@TEMPDT), ECODE
    FROM DIM_ECODES
    WHERE ROW_ID BETWEEN @START AND @END;
 
    SET @TEMPDT =  DATEADD( DAY , 1 , @TEMPDT)
END
SELECT *
FROM FACT_ECODEMONTHLY 
ORDER BY STARTDT, ECODE;