SQL Server 中 for 循环的语法

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/6069024/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-01 10:39:24  来源:igfitidea点击:

Syntax of for-loop in SQL Server

sqlsql-serverloopstsqlsyntax

提问by Macho

What is the syntax of a forloop in TSQL?

forTSQL 中循环的语法是什么?

采纳答案by jams

T-SQL doesn't have a FORloop, it has a WHILEloop
WHILE (Transact-SQL)

T-SQL 没有FOR循环,它有一个WHILE循环
WHILE (Transact-SQL)

WHILE Boolean_expression
BEGIN

END

回答by TcKs

There is no for-loop, only the while-loop:

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

DECLARE @i int = 0

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

回答by Dan Cundy

Extra Info

额外信息

Just to add as no-one has posted an answer that includes how to actually iterate though a dataset inside a loop, you can use the keywords OFFSET FETCH.

只是为了补充,因为没有人发布了一个答案,其中包括如何在循环内实际迭代数据集,您可以使用关键字OFFSET FETCH

Usage

用法

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

回答by kashmir

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

回答by i00

How about this:

这个怎么样:

BEGIN
   Do Something
END
GO 10

... of course you could put an incremental counter inside it if you need to count.

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

回答by Somnath Muluk

For loop is not officially supported yet by SQL server. Already there is answeron achieving FORLoop's different ways. I am detailing answer on ways to achieve different types of loops in SQL server.

SQL 服务器尚未正式支持 For 循环。已经有关于实现FOR循环的不同方式的答案。我正在详细说明在 SQL Server 中实现不同类型循环的方法。

FOR Loop

FOR 循环

DECLARE @cnt INT = 0;

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

PRINT 'Done FOR LOOP';

If you know, you need to complete first iteration of loop anyway, then you can try DO..WHILEor REPEAT..UNTILversion of SQL server.

如果您知道,无论如何您都需要完成循环的第一次迭代,那么您可以尝试使用DO..WHILEREPEAT..UNTIL版本的 SQL 服务器。

DO..WHILE Loop

DO..WHILE 循环

DECLARE @X INT=1;

WAY:  --> Here the  DO statement

  PRINT @X;

  SET @X += 1;

IF @X<=10 GOTO WAY;

REPEAT..UNTIL Loop

REPEAT..UNTIL 循环

DECLARE @X INT = 1;

WAY:  -- Here the REPEAT statement

  PRINT @X;

  SET @X += 1;

IFNOT(@X > 10) GOTO WAY;

Reference

参考

回答by Ragul

Simple answer is NO !!.

简单的答案是NO !!

There is no FORin SQL, But you can use WHILEor GOTOto achieve the way how the FORwill work.

FOR在 SQL中没有,但是您可以使用WHILEGOTO来实现将如何FOR工作的方式。

WHILE :

尽管 :

DECLARE @a INT = 10

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

GOTO :

去 :

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

I always prefer WHILEover GOTOstatement.

我总是喜欢WHILE过度GOTO陈述。

回答by Sameer

While Loop example in T-SQL which list current month's beginning to end date.

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;  

回答by Mahesh Mitikiri

Try it, learn it:

尝试一下,学习一下:

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

With date:

与日期:

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