Sql 使用多个条件创建While循环
我知道这种类型的程序既不可取,也不高效,但我现在需要这种类型的表格,因为我无法得到对我原来问题()的回答。我找到了这个相关的帖子/答案(),但需要根据我的场景进行调整。由于我只是一个数据查询的家伙,我不知道我在这个whilebegin循环中做了什么,我没能找到我起草它的地方 我和前面文章中的用户处于相同的场景中,我不想创建这种类型的表,但是我没有选项和帮助。我非常希望我能像上面的用户那样得到一些帮助/答案 帮帮我,你是我唯一的希望 我试图为两个日期之间的每个产品代码创建一个每日引用记录,在ROWID上循环,直到到达最后一个ROWID整数。它在某个地方被打破了,我只是没有这种编程的经验来找出原因和地点,我试着改变部分来看看它的反应如何,但从来没有成功运行过 我希望专业人士可以简单地看到我在循环中导致它失败的地方,并在日期之间不断迭代,然后在产品表的下一个ROWID上重新启动Sql 使用多个条件创建While循环,sql,sql-server,tsql,Sql,Sql Server,Tsql,我知道这种类型的程序既不可取,也不高效,但我现在需要这种类型的表格,因为我无法得到对我原来问题()的回答。我找到了这个相关的帖子/答案(),但需要根据我的场景进行调整。由于我只是一个数据查询的家伙,我不知道我在这个whilebegin循环中做了什么,我没能找到我起草它的地方 我和前面文章中的用户处于相同的场景中,我不想创建这种类型的表,但是我没有选项和帮助。我非常希望我能像上面的用户那样得到一些帮助/答案 帮帮我,你是我唯一的希望 我试图为两个日期之间的每个产品代码创建一个每日引用记录,在ROW
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;