do while
SQL Server 2008에서 루프 를 구현하는 방법이 있습니까?
do while
SQL Server 2008에서 루프 를 구현하는 방법이 있습니까?
답변:
MS SQL Server 2008의 DO-WHILE에 대해 잘 모르겠지만 DO-WHILE 루프처럼 사용하기 위해 WHILE 루프 논리를 변경할 수 있습니다.
예는 여기에서 가져옵니다 : http://blog.sqlauthority.com/2007/10/24/sql-server-simple-example-of-while-loop-with-continue-and-break-keywords/
WHILE 루프의 예
DECLARE @intFlag INT SET @intFlag = 1 WHILE (@intFlag <=5) BEGIN PRINT @intFlag SET @intFlag = @intFlag + 1 END GO
ResultSet :
1 2 3 4 5
BREAK 키워드가있는 WHILE 루프의 예
DECLARE @intFlag INT SET @intFlag = 1 WHILE (@intFlag <=5) BEGIN PRINT @intFlag SET @intFlag = @intFlag + 1 IF @intFlag = 4 BREAK; END GO
ResultSet :
1 2 3
CONTINUE 및 BREAK 키워드가있는 WHILE 루프의 예
DECLARE @intFlag INT SET @intFlag = 1 WHILE (@intFlag <=5) BEGIN PRINT @intFlag SET @intFlag = @intFlag + 1 CONTINUE; IF @intFlag = 4 -- This will never executed BREAK; END GO
ResultSet :
1 2 3 4 5
그러나 데이터베이스 수준에서 루프 를 피하십시오 . 참조 .
GOTO
키워드로 인해 기분이 상하지 않으면 T-SQL에서 DO
/ 를 시뮬레이션하는 데 사용할 수 있습니다 WHILE
. 의사 코드로 작성된 다음과 같은 다소 무의미한 예를 고려하십시오.
SET I=1
DO
PRINT I
SET I=I+1
WHILE I<=10
다음은 goto를 사용하는 동등한 T-SQL 코드입니다.
DECLARE @I INT=1;
START: -- DO
PRINT @I;
SET @I+=1;
IF @I<=10 GOTO START; -- WHILE @I<=10
GOTO
활성화 된 솔루션과 원본 DO
/ WHILE
의사 코드 간의 일대일 매핑을 확인하십시오 . WHILE
루프를 사용하는 유사한 구현 은 다음과 같습니다.
DECLARE @I INT=1;
WHILE (1=1) -- DO
BEGIN
PRINT @I;
SET @I+=1;
IF NOT (@I<=10) BREAK; -- WHILE @I<=10
END
이제는 물론이 특정 예제를 간단한 WHILE
루프 로 다시 작성할 수 있습니다. DO
/ WHILE
구조에 대한 좋은 후보가 아니기 때문 입니다. DO
/ WHILE
가 필요한 합법적 인 사례 는 드물기 때문에 적용 가능성보다는 예를 간략하게 강조했습니다 .
REPEAT / UNTIL, 누구든지 (T-SQL에서 작동하지 않음)?
SET I=1
REPEAT
PRINT I
SET I=I+1
UNTIL I>10
... 그리고 GOTO
T-SQL 의 기반 솔루션 :
DECLARE @I INT=1;
START: -- REPEAT
PRINT @I;
SET @I+=1;
IF NOT(@I>10) GOTO START; -- UNTIL @I>10
키워드 GOTO
를 통한 창의적인 사용 과 논리 반전을 통해 NOT
원래 의사 코드와 GOTO
기반 솔루션 사이에 매우 밀접한 관계가 있습니다. WHILE
루프를 사용하는 유사한 솔루션 은 다음과 같습니다.
DECLARE @I INT=1;
WHILE (1=1) -- REPEAT
BEGIN
PRINT @I;
SET @I+=1;
IF @I>10 BREAK; -- UNTIL @I>10
END
인수는의 경우에 있다고 할 수 REPEAT
/ UNTIL
의 WHILE
은 if 조건이 반전되지 않기 때문에 기반 솔루션은 간단하다. 반면에 더 장황합니다.
를 사용하는 것에 대한 모든 경멸이 아니었다면 GOTO
명확성을 위해 T-SQL 코드에서 이러한 특정 (사악한) 루프 구조가 필요한 경우에 대한 관용적 솔루션 일 수도 있습니다.
동료 개발자들이 많이 악의적 인 .NET을 사용하여 당신을 잡을 때 분노를 겪지 않도록 노력하면서 자신의 재량에 따라 이것을 사용하십시오 GOTO
.
나는이 기사를 두 번 이상 읽었던 것을 기억하는 것 같고, 대답은 내가 필요한 것에 가깝다 .
일반적으로 DO WHILE
T-SQL에서 필요하다고 생각할 때 커서를 반복하고 있기 때문에 주로 최적의 명확성을 찾고 있습니다 (최적 속도 대비). WHILE TRUE
/ 에 맞는 것처럼 보이는 T-SQL에서 IF BREAK
.
이것이 당신을 여기에 가져온 시나리오라면,이 스 니펫은 당신을 잠시 절약 할 수 있습니다. 그렇지 않으면 다시 환영합니다. 이제 나는 여기에 두 번 이상 있었다는 것을 확신 할 수 있습니다. :)
DECLARE Id INT, @Title VARCHAR(50)
DECLARE Iterator CURSOR FORWARD_ONLY FOR
SELECT Id, Title FROM dbo.SourceTable
OPEN Iterator
WHILE 1=1 BEGIN
FETCH NEXT FROM @InputTable INTO @Id, @Title
IF @@FETCH_STATUS < 0 BREAK
PRINT 'Do something with ' + @Title
END
CLOSE Iterator
DEALLOCATE Iterator
불행히도 T-SQL은이 무한 루프보다 루프 작업을 단독으로 정의하는 더 깨끗한 방법을 제공하지 않는 것 같습니다.
코드를 좀 더 읽기 쉽게하려면 exit 변수를 사용할 수도 있습니다.
DECLARE @Flag int = 0
DECLARE @Done bit = 0
WHILE @Done = 0 BEGIN
SET @Flag = @Flag + 1
PRINT @Flag
IF @Flag >= 5 SET @Done = 1
END
더 복잡한 루프가 있고 논리를 추적하려고 할 때 더 관련이있을 수 있습니다. 명시된 루프는 비싸므로 가능하면 다른 방법을 사용하십시오.
SQL 서버는 While Loop 만 공식적으로 지원합니다. 이미 DO while 루프에 대한 답변 이 있습니다. SQL 서버에서 다양한 유형의 루프를 달성하는 방법에 대한 답변을 자세히 설명하고 있습니다.
어쨌든 루프의 첫 번째 반복을 완료해야하는 경우 SQL 서버의 DO..WHILE 또는 REPEAT..UNTIL 버전을 시도 할 수 있습니다 .
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;
DECLARE @cnt INT = 0;
WHILE @cnt < 10
BEGIN
PRINT 'Inside FOR LOOP';
SET @cnt = @cnt + 1;
END;
PRINT 'Done FOR LOOP';