Existe algum método para implementar do while
loop no SQL server 2008?
Existe algum método para implementar do while
loop no SQL server 2008?
Respostas:
Não tenho certeza sobre o DO-WHILE NO MS SQL Server 2008, mas você pode alterar a lógica do loop WHILE, para usar como o loop DO-WHILE.
Exemplos são obtidos aqui: http://blog.sqlauthority.com/2007/10/24/sql-server-simple-example-of- while - loop - with - continue - and - break - keywords/
Exemplo de loop WHILE
DECLARE @intFlag INT SET @intFlag = 1 WHILE (@intFlag <=5) BEGIN PRINT @intFlag SET @intFlag = @intFlag + 1 END GO
Conjunto de resultados:
1 2 3 4 5
Exemplo de loop WHILE com a palavra-chave BREAK
DECLARE @intFlag INT SET @intFlag = 1 WHILE (@intFlag <=5) BEGIN PRINT @intFlag SET @intFlag = @intFlag + 1 IF @intFlag = 4 BREAK; END GO
Conjunto de resultados:
1 2 3
Exemplo de loop WHILE com palavras-chave CONTINUE e BREAK
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
Conjunto de resultados:
1 2 3 4 5
Mas tente evitar loops no nível do banco de dados. Referência .
Se você não se ofender com a GOTO
palavra-chave, ela poderá ser usada para simular um DO
/ WHILE
no T-SQL. Considere o seguinte exemplo sem sentido escrito em pseudocódigo:
SET I=1
DO
PRINT I
SET I=I+1
WHILE I<=10
Aqui está o código T-SQL equivalente usando goto:
DECLARE @I INT=1;
START: -- DO
PRINT @I;
SET @I+=1;
IF @I<=10 GOTO START; -- WHILE @I<=10
Observe a 1-1 mapeamento entre a GOTO
solução activada e o original DO
/ WHILE
pseudocódigo. Uma implementação semelhante usando um WHILE
loop seria semelhante a:
DECLARE @I INT=1;
WHILE (1=1) -- DO
BEGIN
PRINT @I;
SET @I+=1;
IF NOT (@I<=10) BREAK; -- WHILE @I<=10
END
Agora, é claro que você pode reescrever esse exemplo em particular como um WHILE
loop simples , pois esse não é um candidato tão bom para uma DO
/ WHILE
construção. A ênfase foi dada ao exemplo de concisão e não de aplicabilidade, uma vez que casos legítimos que requerem DO
/ WHILE
são raros.
REPEAT / ATÉ, alguém (NÃO funciona em T-SQL)?
SET I=1
REPEAT
PRINT I
SET I=I+1
UNTIL I>10
... e a GOTO
solução baseada em T-SQL:
DECLARE @I INT=1;
START: -- REPEAT
PRINT @I;
SET @I+=1;
IF NOT(@I>10) GOTO START; -- UNTIL @I>10
Através do uso criativo GOTO
e da inversão lógica via NOT
palavra - chave, existe uma relação muito próxima entre o pseudocódigo original e a GOTO
solução baseada. Uma solução semelhante usando um WHILE
loop se parece com:
DECLARE @I INT=1;
WHILE (1=1) -- REPEAT
BEGIN
PRINT @I;
SET @I+=1;
IF @I>10 BREAK; -- UNTIL @I>10
END
Pode-se argumentar que, para o caso de REPEAT
/ UNTIL
, oWHILE
solução baseada é mais simples, porque a condição if não é invertida. Por outro lado, também é mais detalhado.
Se não fosse por todo o desdém pelo uso de GOTO
, essas podem até ser soluções idiomáticas para aquelas poucas vezes em que essas construções de loop particulares (más) são necessárias no código T-SQL por uma questão de clareza.
Use-os a seu próprio critério, tentando não sofrer a ira de seus colegas desenvolvedores quando eles pegarem você usando os muito difamados GOTO
.
Lembro-me de ler este artigo mais de uma vez, e a resposta está próxima do que eu preciso.
Normalmente, quando penso que vou precisar de um DO WHILE
T-SQL, é porque estou repetindo um cursor e procurando em grande parte uma clareza ideal (vs. velocidade ideal). No T-SQL, isso parece se encaixar em um WHILE TRUE
/ IF BREAK
.
Se esse foi o cenário que trouxe você aqui, esse trecho pode economizar um momento. Caso contrário, bem vindo de volta, eu. Agora posso ter certeza de que estive aqui mais de uma vez. :)
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
Infelizmente, o T-SQL não parece oferecer uma maneira mais limpa de definir a operação de loop individualmente do que esse loop infinito.
Você também pode usar uma variável de saída se quiser que seu código seja um pouco mais legível:
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
Isso provavelmente seria mais relevante quando você tiver um loop mais complicado e estiver tentando acompanhar a lógica. Como os loops declarados são caros, tente usar outros métodos, se puder.
Somente While Loop é oficialmente suportado pelo SQL server. Já existe resposta para DO while loop. Estou detalhando a resposta sobre maneiras de obter diferentes tipos de loops no SQL Server.
Se você sabe, você precisa completar primeira iteração do loop de qualquer maneira, então você pode tentar do..while ou repeat..until versão do servidor SQL.
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';