SQL中的While循环如何工作

时间:2018-08-15 13:47:45

标签: sql sql-server

我正在使用sql中的While循环,并且尝试在这些日期应用代码。

DECLARE @StartDate DATETIME = '2018-08-01';
DECLARE @EndDate DATETIME = '2018-08-15';

WHILE @StartDate < @EndDate

BEGIN

SELECT @StartDate 
SET @StartDate = @StartDate+1

END;

运行此命令时,我希望在多个窗口中获得输出,尽管我希望它位于同一窗口中。

enter image description here

3 个答案:

答案 0 :(得分:4)

您的循环正在进行选择,因此循环的每次迭代都将提供一个新的查询结果窗口。如果希望它作为一个结果集返回,则必须将其插入表中并在循环之外选择所有内容。

DECLARE @StartDate DATETIME = '2018-08-01';
DECLARE @EndDate DATETIME = '2018-08-15';
DECLARE @table TABLE (yourdate DATETIME)
WHILE @StartDate < @EndDate

BEGIN

INSERT INTO @table (yourdate)
SELECT @startdate 
SET @StartDate = @StartDate+1

END;

SELECT * 
FROM @Table

答案 1 :(得分:3)

您可以将recursive waycommon_table_expression 结合使用:

DECLARE @StartDate DATETIME = '2018-08-01';
DECLARE @EndDate DATETIME = '2018-08-15';

WITH t AS (
     SELECT @StartDate AS Startdate
     UNION ALL
     SELECT DATEADD(DAY, 1, Startdate)
     FROM t
     WHERE Startdate < @EndDate 
)

SELECT Startdate
FROM t;

答案 2 :(得分:1)

尝试使用#temp表,因为每当循环运行时,您都在选择一个新的SELECT语句,这就是为什么它出现在另一个窗口中。要在一个窗口中获得所有结果,可以尝试使用CTE#temp表。

DECLARE @StartDate DATETIME = '2018-08-01';
DECLARE @EndDate DATETIME = '2018-08-15';

CREATE TABLE #Temp 
(
Date date
)

WHILE @StartDate < @EndDate

BEGIN

INSERT INTO #Temp VALUES (@StartDate)

SET @StartDate = @StartDate+1

END;

SELECT * FROM #Temp