SQL Server中的for循环语法

TSQL中for循环的语法是什么?

774495 次浏览
T-SQL没有FOR循环,它有一个WHILE循环
而(transact - sql) < / p >
WHILE Boolean_expression
BEGIN


END

没有for循环,只有while循环:

DECLARE @i int = 0


WHILE @i < 20
BEGIN
SET @i = @i + 1
/* do some work */
END

DECLARE @intFlag INT
SET @intFlag = 1
WHILE (@intFlag <=5)
BEGIN
PRINT @intFlag
SET @intFlag = @intFlag + 1
END
GO

这个怎么样:

BEGIN
Do Something
END
GO 10

... 当然,如果需要计数,可以在其中放入增量计数器。

简单的答案是NO !!

在SQL中没有FOR,但是你可以使用WHILEGOTO来实现 FOR的工作方式

而:

DECLARE @a INT = 10


WHILE @a <= 20
BEGIN
PRINT @a
SET @a = @a + 1
END

转到:

DECLARE @a INT = 10
a:
PRINT @a
SET @a = @a + 1
IF @a < = 20
BEGIN
GOTO a
END

我总是更喜欢WHILE而不是GOTO语句。

额外的信息

只是补充一下,因为没有人发布了一个答案,包括如何在循环中迭代数据集。你可以使用关键字抵消取回

使用

DECLARE @i INT = 0;
SELECT @count=  Count(*) FROM {TABLE}


WHILE @i <= @count
BEGIN
       

SELECT * FROM {TABLE}
ORDER BY {COLUMN}
OFFSET @i ROWS
FETCH NEXT 1 ROWS ONLY


SET @i = @i + 1;


END

SQL server还没有正式支持For循环。已经有回答实现循环的不同方式。我正在详细回答如何在SQL server中实现不同类型的循环。

FOR循环

DECLARE @cnt INT = 0;


WHILE @cnt < 10
BEGIN
PRINT 'Inside FOR LOOP';
SET @cnt = @cnt + 1;
END;


PRINT 'Done FOR LOOP';

如果你知道,无论如何你都需要完成循环的第一次迭代,那么你可以尝试做. .重复,直到版本的SQL server。

做. . WHILE循环

DECLARE @X INT=1;


WAY:  --> Here the  DO statement


PRINT @X;


SET @X += 1;


IF @X<=10 GOTO WAY;

重复,直到循环

DECLARE @X INT = 1;


WAY:  -- Here the REPEAT statement


PRINT @X;


SET @X += 1;


IFNOT(@X > 10) GOTO WAY;

Reference .

T-SQL中的While循环示例,其中列出了当前月份的开始到结束日期。

DECLARE @Today DATE= GETDATE() ,
@StartOfMonth DATE ,
@EndOfMonth DATE;


DECLARE @DateList TABLE ( DateLabel VARCHAR(10) );
SET @EndOfMonth = EOMONTH(GETDATE());
SET @StartOfMonth = DATEFROMPARTS(YEAR(@Today), MONTH(@Today), 1);


WHILE @StartOfMonth <= @EndOfMonth
BEGIN
INSERT  INTO @DateList
VALUES  ( @StartOfMonth );
SET @StartOfMonth = DATEADD(DAY, 1, @StartOfMonth);
END;


SELECT  DateLabel
FROM    @DateList;

尝试一下,学习一下:

DECLARE @r INT = 5
DECLARE @i INT = 0
DECLARE @F varchar(max) = ''
WHILE @i < @r
BEGIN


DECLARE @j INT = 0
DECLARE @o varchar(max) = ''
WHILE @j < @r - @i - 1
BEGIN
SET @o = @o + ' '
SET @j += 1
END


DECLARE @k INT = 0
WHILE @k < @i + 1
BEGIN
SET @o = @o + ' *'  -- '*'
SET @k += 1
END
SET @i += 1
SET @F = @F + @o + CHAR(13)
END
PRINT @F

日期:

DECLARE @d DATE = '2019-11-01'
WHILE @d < GETDATE()
BEGIN
PRINT @d
SET @d = DATEADD(DAY,1,@d)
END
PRINT 'n'
PRINT @d

老帖子了,但还是会出现,我想我应该提供一个&;foreach &;为那些需要的人提供解决方案。

DECLARE @myValue nvarchar(45);
DECLARE myCursor CURSOR FOR
SELECT [x]
FROM (Values ('Value1'),('Value2'),('Value3'),('Value4'))
as MyTable(x);
OPEN myCursor;
FETCH NEXT FROM myCursor INTO @myValue;
While (@@FETCH_STATUS = 0)
BEGIN
PRINT @myValue
FETCH NEXT FROM myCursor INTO @myValue;
END
CLOSE myCursor;
DEALLOCATE myCursor;

我应该声明一下,在SQL世界中,递归是不受欢迎的。这是有原因的——它对性能非常不利。不过,对于维护/脱机/批量/临时/测试等操作,我经常使用这种方法。