SQL Server 中 for 循环的语法

问题描述 投票:0回答:11

TSQL 中

for
循环的语法是什么?

sql sql-server loops t-sql syntax
11个回答
466
投票

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

DECLARE @i int = 0

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

248
投票

T-SQL 没有

FOR
循环,它有
WHILE
循环
WHILE (Transact-SQL)

WHILE Boolean_expression
BEGIN

END

75
投票

额外信息

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

使用方法

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

29
投票

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

7
投票

SQL Server 尚未正式支持 For 循环。已经有关于实现 FOR 循环的不同方式的 answer。我正在详细回答如何在 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 的 DO..WHILEREPEAT..UNTIL 版本。

DO..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;

参考


6
投票

简单的答案是

NO !!

SQL中没有

FOR
,但是可以使用
WHILE
GOTO
来实现
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
声明。


6
投票

这个怎么样:

BEGIN
   Do Something
END
GO 10

...当然如果你需要计数的话你可以在里面放一个增量计数器。


3
投票

旧线程但仍在出现,我想我会为那些需要的人提供一个“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 世界中是不受欢迎的。有充分的理由——这可能对性能非常不利。尽管如此,对于维护/离线/批量/临时/测试/等操作,我经常使用这种方法。


1
投票

尝试一下,学习一下:

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

0
投票

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;  

0
投票

此查询是一个 MySQL 过程,将显示一个表,该表显示从 0 到给定范围的自然数之和。

语法结构为:

开始 声明 var 数据类型; 设置 var = 某事 NAME_OF_YOUR_LOOP:循环
价值更新 条件(防止无限循环所必需的) 结束循环 NAME_OF_YOUR_LOOP 结束

DELIMITER $$
CREATE PROCEDURE SUM_OF_NATURAL_NUMS(IN maxrange INT)
BEGIN
    DECLARE r INT;
    DECLARE s INT;
    SET r = 1;
    SET s = 0;
    LOOP_LABEL: LOOP
          if r = maxrange THEN 
            LEAVE LOOP_LABEL;   -- terminate the loop
        END IF;
        SET r = r + 1;
        SET s = s + r;
       END LOOP LOOP_LABEL;
      SELECT s;
END $$
DELIMITER $$

CALL SUM_OF_NATURAL_NUMS(100); 
© www.soinside.com 2019 - 2024. All rights reserved.