WHILE (Transact-SQL)WHILE (Transact-SQL)

SE APLICA A: síSQL Server síAzure SQL Database síAzure Synapse Analytics (SQL DW) síAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure Synapse Analytics (SQL DW) yesParallel Data Warehouse

Establece una condición para la ejecución repetida de una instrucción o bloque de instrucciones SQL.Sets a condition for the repeated execution of an SQL statement or statement block. Las instrucciones se ejecutan repetidamente siempre que la condición especificada sea verdadera.The statements are executed repeatedly as long as the specified condition is true. Se puede controlar la ejecución de instrucciones en el bucle WHILE con las palabras clave BREAK y CONTINUE.The execution of statements in the WHILE loop can be controlled from inside the loop with the BREAK and CONTINUE keywords.

Icono de vínculo de tema Convenciones de sintaxis de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxisSyntax

-- Syntax for SQL Server and Azure SQL Database  
  
WHILE Boolean_expression   
     { sql_statement | statement_block | BREAK | CONTINUE }  
  
-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse  
  
WHILE Boolean_expression   
     { sql_statement | statement_block | BREAK }  
  

ArgumentosArguments

Boolean_expressionBoolean_expression
Es una expresión que devuelve TRUE o FALSE.Is an expression that returns TRUE or FALSE. Si la expresión booleana contiene una instrucción SELECT, la instrucción SELECT debe ir entre paréntesis.If the Boolean expression contains a SELECT statement, the SELECT statement must be enclosed in parentheses.

{sql_statement | statement_block}{sql_statement | statement_block}
Se trata de cualquier instrucción o grupo de instrucciones Transact-SQLTransact-SQL definidas con un bloque de instrucciones.Is any Transact-SQLTransact-SQL statement or statement grouping as defined with a statement block. Para definir un bloque de instrucciones, utilice las palabras clave de control de flujo BEGIN y END.To define a statement block, use the control-of-flow keywords BEGIN and END.

BREAKBREAK
Produce la salida del bucle WHILE más interno.Causes an exit from the innermost WHILE loop. Se ejecutan las instrucciones que aparecen después de la palabra clave END, que marca el final del bucle.Any statements that appear after the END keyword, marking the end of the loop, are executed.

CONTINUECONTINUE
Hace que se reinicie el bucle WHILE y omite las instrucciones que haya después de la palabra clave CONTINUE.Causes the WHILE loop to restart, ignoring any statements after the CONTINUE keyword.

NotasRemarks

Si dos o más bucles WHILE están anidados, la instrucción BREAK interna sale al siguiente bucle más externo.If two or more WHILE loops are nested, the inner BREAK exits to the next outermost loop. Todas las instrucciones que se encuentran después del final del bucle interno deben ejecutarse primero y después se reinicia el siguiente bucle más externo.All the statements after the end of the inner loop run first, and then the next outermost loop restarts.

EjemplosExamples

A.A. Utilizar BREAK y CONTINUE con IF…ELSE y WHILE anidadosUsing BREAK and CONTINUE with nested IF...ELSE and WHILE

En el ejemplo siguiente, si el precio de venta promedio de un producto es inferior a $300, el bucle WHILE dobla los precios y, a continuación, selecciona el precio máximo.In the following example, if the average list price of a product is less than $300, the WHILE loop doubles the prices and then selects the maximum price. Si el precio máximo es menor o igual que $500, el bucle WHILE se reinicia y vuelve a doblar los precios.If the maximum price is less than or equal to $500, the WHILE loop restarts and doubles the prices again. Este bucle continúa doblando los precios hasta que el precio máximo es mayor que $500, después de lo cual sale del bucle WHILE e imprime un mensaje.This loop continues doubling the prices until the maximum price is greater than $500, and then exits the WHILE loop and prints a message.

USE AdventureWorks2012;  
GO  
WHILE (SELECT AVG(ListPrice) FROM Production.Product) < $300  
BEGIN  
   UPDATE Production.Product  
      SET ListPrice = ListPrice * 2  
   SELECT MAX(ListPrice) FROM Production.Product  
   IF (SELECT MAX(ListPrice) FROM Production.Product) > $500  
      BREAK  
   ELSE  
      CONTINUE  
END  
PRINT 'Too much for the market to bear';  

B.B. Usar WHILE en un cursorUsing WHILE in a cursor

En el ejemplo siguiente se usa @@FETCH_STATUS para controlar las actividades del cursor en un bucle WHILE.The following example uses @@FETCH_STATUS to control cursor activities in a WHILE loop.

DECLARE @EmployeeID as nvarchar(256)
DECLARE @Title as nvarchar(50)

DECLARE Employee_Cursor CURSOR FOR  
SELECT LoginID, JobTitle   
FROM AdventureWorks2012.HumanResources.Employee  
WHERE JobTitle = 'Marketing Specialist';  
OPEN Employee_Cursor;  
FETCH NEXT FROM Employee_Cursor INTO @EmployeeID, @Title;  
WHILE @@FETCH_STATUS = 0  
   BEGIN  
      Print '   ' + @EmployeeID + '      '+  @Title 
      FETCH NEXT FROM Employee_Cursor INTO @EmployeeID, @Title;  
   END;  
CLOSE Employee_Cursor;  
DEALLOCATE Employee_Cursor;  
GO 

Ejemplos: Azure Synapse Analytics (SQL DW)Azure Synapse Analytics (SQL DW) y Almacenamiento de datos paralelosParallel Data WarehouseExamples: Azure Synapse Analytics (SQL DW)Azure Synapse Analytics (SQL DW) and Almacenamiento de datos paralelosParallel Data Warehouse

C. Bucle WHILE simpleC: Simple While Loop

En el ejemplo siguiente, si el precio de venta promedio de un producto es inferior a $300, el bucle WHILE dobla los precios y, a continuación, selecciona el precio máximo.In the following example, if the average list price of a product is less than $300, the WHILE loop doubles the prices and then selects the maximum price. Si el precio máximo es menor o igual que $500, el bucle WHILE se reinicia y vuelve a doblar los precios.If the maximum price is less than or equal to $500, the WHILE loop restarts and doubles the prices again. Este bucle continúa doblando los precios hasta que el precio máximo es mayor que $500, después de lo cual sale del bucle WHILE.This loop continues doubling the prices until the maximum price is greater than $500, and then exits the WHILE loop.

-- Uses AdventureWorks  
  
WHILE ( SELECT AVG(ListPrice) FROM dbo.DimProduct) < $300  
BEGIN  
    UPDATE dbo.DimProduct  
        SET ListPrice = ListPrice * 2;  
    SELECT MAX ( ListPrice) FROM dbo.DimProduct  
    IF ( SELECT MAX (ListPrice) FROM dbo.DimProduct) > $500  
        BREAK;  
END  
  

Consulte tambiénSee Also

ALTER TRIGGER (Transact-SQL) ALTER TRIGGER (Transact-SQL)
Lenguaje de control de flujo (Transact-SQL) Control-of-Flow Language (Transact-SQL)
CREATE TRIGGER (Transact-SQL) CREATE TRIGGER (Transact-SQL)
Cursores (Transact-SQL) Cursors (Transact-SQL)
SELECT (Transact-SQL)SELECT (Transact-SQL)