SQL Server에서 for-loop의 구문


238

forTSQL 에서 루프 구문은 무엇입니까 ?


10
SQL은 익숙한 언어와는 매우 다른 언어입니다. 방법이 아니라 무엇에 초점을 맞추고 있습니다. SQL Server에 원하는 결과를 알려주고 응답을 생성하는 방법을 알아냅니다. 또는 방금 말한 것을 대답하기 위해 SQL에는 for 루프가 없습니다.
Damien_The_Unbeliever

5
WHILE @I < 10; SET @I = @I + 1; BEGIN; ...; END? 그러나 대부분의 쿼리 처리에는 사용 하지 않아야 합니다 (그러나 명령형 조작에는 필요). 검색 "tsql for loop"를 사용하여 Google에서 이러한 많은 지침 / 힌트를 사용할 수 있습니다.

7
JOIN 및 설정 조작에 유리한 루프를 피하십시오.
Oded

2
SQL 전문가가 아닌 경우 루프 사용을 고려하지 않아야합니다. 몇 가지 조건 만 필요한 경우가 많으며 대부분의 나머지 시간에는 루프를 사용하는 것이 자동차를 운전하는 대신 자동차를 밀는 것과 같습니다. 레코드를 반복하는 대신 데이터 세트로 생각하는 법을 배웁니다. 루핑은 구문이 어렵 기 때문에가 아니라 사용하기 전에 얼마나 많은 피해를 줄 수 있는지 알아야하기 때문에 전문가 수준의 기능입니다.
HLGEM

2
때로는 나중에 곧 삭제하려는 테스트 데이터베이스에서 테스트 데이터를 빠르게 활용하는 데 사용될 수도 있습니다. 이 경우이를 사용하면 C #과 같은 것으로 작성된 별도의 프로그램을 거치지 않아도되며 엔지니어링은 특별히 중요하지 않습니다. 다시, 나는 단지 테스트 데이터의 관점에서 이것을 말하고 있습니다.
Panzercrisis

답변:


210

T-SQL에는 FOR루프 가없고 WHILE루프가 있습니다.
WHILE (Transact-SQL)

WHILE Boolean_expression
BEGIN

END

8
SQL의 루핑 구성보다 JOIN (및 세트 조작)이 선호되어야합니다.
Oded

6
Damien의 말에 따르면 스트레스, 특히 SQL을 처음 접하는 사람들에게는 스트레스에 대한 제한이 없습니다. "SQL은 익숙한 언어와는 매우 다른 언어입니다. SQL Server는 무엇에 초점을 맞추고 있습니다. "
ypercubeᵀᴹ

1
MS 문서가 실제로 잘못되었다는 점에 주목하는 것이 흥미 롭습니다. WHILE은 부울 표현식을 사용하지 않습니다. 술어가 필요합니다.이 술어는 TRUE 또는 FALSE로 평가할 수있을뿐만 아니라 알 수 없습니다.
Damien_The_Unbeliever

360

for 루프는없고 while 루프 만 있습니다 :

DECLARE @i int = 0

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

20
루프에서 인덱스를 사용하려는 경우 사용 사례에 따라 첫 번째 대신 마지막 항목을 늘리는 것이 좋습니다.
jinglesthula

3
또한 로컬 변수의 기본값은 일반 SQL에서 지원되지 않습니다. 따라서 SET @i = 0for 루프 전에 별도의 것이 필요 합니다.
Nux

1
@Nux : 0은 명시 적으로 선언하는 동안 설정됩니다
TcKs

7
예. 그러나 이전 SQL Server에서는 작동하지 않습니다 (적어도 2005 년에는 작동하지 않음).
Nux

또한 일반적으로 정수가 증가하기 전에 작업이 수행됩니다. SQL의 많은 for 루프는 실제로 작업에서 해당 정수를 사용합니다 (행에서 행으로 또는 결과로 임시 테이블을 초래 함). 증분이 끝이 아닌 사이클의 시작에서 발생하면 중단 될 수 있습니다.
CSS

34

추가 정보

아무도 루프 내부의 데이터 세트를 실제로 반복하는 방법을 포함하는 답변을 아무도 게시하지 않았기 때문에 키워드 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

2
커서 사용에 대한 좋은 대안.
DanteTheSmith

28

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

13
스택 오버플로에 오신 것을 환영합니다! 이 코드가 작동하는 이유를 설명하기 위해 설명을 추가하고 질문에 대한 대답은 무엇입니까? 이것은 질문하는 사람과 함께 오는 다른 사람에게 매우 도움이 될 것입니다.
Andrew Barber

18
이것은 자명하다.
Edward Olamisan 2016 년

4
이것은 자기 설명이 아닌가? 나는 같은 질문을했고, 그 대답을 즉시 이해했습니다.
DanteTheSmith

1
이 답변이 명명 규칙을 제외하고 @TcK와 어떻게 다른가요?
Sushil Jadhav

7

이건 어때요:

BEGIN
   Do Something
END
GO 10

... 카운트해야 할 경우 증분 카운터를 넣을 수 있습니다.


3
'GO 10'? SQL Server 2008은 마음에 들지 않습니다.
자원

7

For 루프는 아직 SQL Server에서 공식적으로 지원되지 않습니다. 이미 FOR 달성에 대한 답변이 있습니다 Loop의 다양한 방식 있습니다. 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 서버의 DO..WHILE 또는 REPEAT..UNTIL 버전을 시도 할 수 있습니다 .

DO..WHILE 루프

DECLARE @X INT=1;

WAY:  --> Here the  DO statement

  PRINT @X;

  SET @X += 1;

IF @X<=10 GOTO WAY;

반복 .. UNTIL 루프

DECLARE @X INT = 1;

WAY:  -- Here the REPEAT statement

  PRINT @X;

  SET @X += 1;

IFNOT(@X > 10) GOTO WAY;

참고


이것은 복사하여 붙여 넣은 것으로 보입니다. stackoverflow.com/a/46363319/8239061
SecretAgentMan

@SecretAgentMan : 두 가지 답변이 서로 다른 질문에 대답합니다. 두 답변 모두에 제공된 추가 데이터.
Somnath Muluk

6

간단한 대답은 NO !!입니다.

FORSQL 에는 없지만 , 작동 방식을 사용 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.


1
나는 당신이 두 대안을 모두 언급 한 방법을 좋아합니다. 대부분의 답변처럼 단 하나입니다.
DanteTheSmith

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

사용 해보고 배우십시오.

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.