ArgumentosArguments

WITH <common_table_expression>WITH <common_table_expression>Especifica la vista o el conjunto de resultados temporal indicado, que también se conoce como expresión de tabla común (CTE), definido en el ámbito de la instrucción UPDATE.Specifies the temporary named result set or view, also known as common table expression (CTE), defined within the scope of the UPDATE statement.El conjunto de resultados CTE se deriva de una consulta simple. La instrucción UPDATE hace referencia al conjunto de resultados.The CTE result set is derived from a simple query and is referenced by UPDATE statement.

Parte superior (expresión ***)* [%]TOP (expression) [ PERCENT ]Especifica el número o porcentaje de filas que se actualizan.Specifies the number or percent of rows that are updated.expression puede ser un número o un porcentaje de las filas.expression can be either a number or a percent of the rows.

Las filas a las que se hace referencia en la expresión TOP utilizada con INSERT, UPDATE o DELETE no se ordenan.The rows referenced in the TOP expression used with INSERT, UPDATE, or DELETE are not arranged in any order.

table_aliastable_aliasAlias especificado en la cláusula FROM que representa la tabla o vista de la que se van a actualizar las filas.The alias specified in the FROM clause representing the table or view from which the rows are to be updated.

@Lengthes la longitud de la sección en la columna, a partir de @Offset , que se sustituye por expresión.@Length is the length of the section in the column, starting from @Offset, that is replaced by expression.@Lengthes bigint y no puede ser un número negativo.@Length is bigint and cannot be a negative number.Si @Length es NULL, la operación de actualización quita todos los datos de @Offset al final de la column_name valor.If @Length is NULL, the update operation removes all data from @Offset to the end of the column_name value.

DESDE <table_source >FROM <table_source>Especifica que se utiliza un origen de tabla, vista o tabla derivada para proporcionar los criterios de la operación de actualización.Specifies that a table, view, or derived table source is used to provide the criteria for the update operation.Para obtener más información, vea FROM (Transact-SQL).For more information, see FROM (Transact-SQL).

Si el objeto que se actualiza es el que se indica en la cláusula FROM y solo hay una referencia al objeto en ella, puede especificarse o no un alias de objeto.If the object being updated is the same as the object in the FROM clause and there is only one reference to the object in the FROM clause, an object alias may or may not be specified.Si el objeto que se actualiza aparece más de una vez en la cláusula FROM, una única referencia al objeto no debe especificar un alias de tabla.If the object being updated appears more than one time in the FROM clause, one, and only one, reference to the object must not specify a table alias.Todas las demás referencias al objeto de la cláusula FROM deben incluir un alias de objeto.All other references to the object in the FROM clause must include an object alias.

Una vista con un desencadenador INSTEAD OF UPDATE no puede ser el destino de UPDATE con una cláusula FROM.A view with an INSTEAD OF UPDATE trigger cannot be a target of an UPDATE with a FROM clause.

Nota

Las llamadas a OPENDATASOURCE, OPENQUERY u OPENROWSET en la cláusula FROM se evalúan por separado y de forma independiente de otras llamadas a estas funciones utilizadas como destino de la actualización, incluso si se han suministrado argumentos idénticos a las dos llamadas.Any call to OPENDATASOURCE, OPENQUERY, or OPENROWSET in the FROM clause is evaluated separately and independently from any call to these functions used as the target of the update, even if identical arguments are supplied to the two calls.En particular, las condiciones de filtro o combinación aplicadas en el resultado de una de esas llamadas no tienen ningún efecto en los resultados de la otra llamada.In particular, filter or join conditions applied on the result of one of those calls have no effect on the results of the other.

WHEREWHEREEspecifica las condiciones que limitan las filas que se actualizan.Specifies the conditions that limit the rows that are updated.Hay dos modos de actualización, dependiendo del formato de cláusula WHERE que se utilice:There are two forms of update based on which form of the WHERE clause is used:

Las actualizaciones posicionadas utilizan la cláusula CURRENT OF para especificar un cursor.Positioned updates use the CURRENT OF clause to specify a cursor.La operación de actualización se produce en la posición actual del cursor.The update operation occurs at the current position of the cursor.

<search_condition><search_condition>Especifica la condición que debe cumplirse para que se actualicen las filas.Specifies the condition to be met for the rows to be updated.La condición de búsqueda también puede ser la condición en la que se basa una combinación.The search condition can also be the condition upon which a join is based.No hay límite en el número de predicados que se pueden incluir en una condición de búsqueda.There is no limit to the number of predicates that can be included in a search condition.Para obtener más información sobre predicados y condiciones de búsqueda, vea condición de búsqueda ( Transact-SQL ) .For more information about predicates and search conditions, see Search Condition (Transact-SQL).

CURRENT OFCURRENT OFIndica que la actualización se realice en la posición actual del cursor especificado.Specifies that the update is performed at the current position of the specified cursor.

Una actualización posicionada que utiliza una cláusula WHERE CURRENT OF actualiza la fila que se encuentra en la posición actual del cursor.A positioned update using a WHERE CURRENT OF clause updates the single row at the current position of the cursor.Esto puede ser más preciso que una actualización por búsqueda que utilice un WHERE <search_condition > cláusula para calificar las filas que se va a actualizar.This can be more accurate than a searched update that uses a WHERE <search_condition> clause to qualify the rows to be updated.Una actualización por búsqueda modifica varias filas cuando la condición de búsqueda no identifica una sola fila de forma exclusiva.A searched update modifies multiple rows when the search condition does not uniquely identify a single row.

cursor_namecursor_nameEs el nombre del cursor abierto desde el que se debe realizar la captura.Is the name of the open cursor from which the fetch should be made.Si tanto un cursor global y otro local con el nombre cursor_name existe, este argumento hace referencia al cursor global si se especifica GLOBAL; en caso contrario, hace referencia al cursor local.If both a global and a local cursor with the name cursor_name exist, this argument refers to the global cursor if GLOBAL is specified; otherwise, it refers to the local cursor.El cursor debe permitir actualizaciones.The cursor must allow updates.

cursor_variable_namecursor_variable_nameEs el nombre de una variable de cursor.Is the name of a cursor variable.cursor_variable_name debe hacer referencia a un cursor que permita realizar actualizaciones.cursor_variable_name must reference a cursor that allows updates.

Es posible utilizar nombres de variables en las instrucciones UPDATE para mostrar los valores nuevos y antiguos afectados, pero solo se recomienda cuando la instrucción UPDATE afecta a un único registro.Variable names can be used in UPDATE statements to show the old and new values affected, but this should be used only when the UPDATE statement affects a single record.Si la instrucción UPDATE afecta a varios registros, para devolver los valores antiguos y nuevos para cada registro, use el cláusula OUTPUT.If the UPDATE statement affects multiple records, to return the old and new values for each record, use the OUTPUT clause.

Actúe con precaución al especificar la cláusula FROM para proporcionar los criterios de la operación de actualización.Use caution when specifying the FROM clause to provide the criteria for the update operation.Los resultados de una instrucción UPDATE son indefinidos si la instrucción incluye una cláusula FROM que no se especifica de tal forma que solo un valor está disponible para cada ocurrencia de columna que se actualiza, es decir, si la instrucción UPDATE no determinista.The results of an UPDATE statement are undefined if the statement includes a FROM clause that is not specified in such a way that only one value is available for each column occurrence that is updated, that is if the UPDATE statement is not deterministic.Por ejemplo, en la instrucción UPDATE del siguiente script, las dos filas de Table1 cumplen los requisitos de la cláusula FROM de la instrucción UPDATE, pero no se define qué fila de Table1 se utiliza para actualizar la fila de Table2.For example, in the UPDATE statement in the following script, both rows in Table1 meet the qualifications of the FROM clause in the UPDATE statement; but it is undefined which row from Table1 is used to update the row in Table2.

Puede ocurrir el mismo problema cuando se combinan las cláusulas FROM y WHERE CURRENT OF.The same problem can occur when the FROM and WHERE CURRENT OF clauses are combined.En el ejemplo siguiente, las dos filas de Table2 cumplen los requisitos de la cláusula FROM de la instrucción UPDATE.In the following example, both rows in Table2 meet the qualifications of the FROM clause in the UPDATE statement.No se ha definido qué fila de Table2 se utilizará para actualizar la fila de Table1.It is undefined which row from Table2 is to be used to update the row in Table1.

Soporte de compatibilidadCompatibility Support

En una versión futura de SQL ServerSQL Server se quitará el uso de las sugerencias READUNCOMMITTED y NOLOCK en la cláusula FROM que se aplican a la tabla de destino de una instrucción UPDATE o DELETE.Support for use of the READUNCOMMITTED and NOLOCK hints in the FROM clause that apply to the target table of an UPDATE or DELETE statement will be removed in a future version of SQL ServerSQL Server.Evite usar estas sugerencias en este contexto en el nuevo trabajo de desarrollo y planee modificar las aplicaciones que las usan actualmente.Avoid using these hints in this context in new development work, and plan to modify applications that currently use them.

Si la instrucción UPDATE puede cambiar más de una fila al actualizar la clave de agrupación en clústeres y a uno o varios texto, ntext, o imagen columnas, la actualización parcial Estas columnas se ejecuta como una sustitución completa de los valores.If the UPDATE statement could change more than one row while updating both the clustering key and one or more text, ntext, or image columns, the partial update to these columns is executed as a full replacement of the values.

Modifica más de una fila y también actualiza la clave de un índice clúster no único en un valor no constante.Modifies more than one row and also updates the key of a nonunique clustered index to a nonconstant value.

No se puede utilizar el . Cláusula de escritura para actualizar una columna NULL o establecer el valor de column_name en NULL.You cannot use the .WRITE clause to update a NULL column or set the value of column_name to NULL.

Limitar las filas que se actualizanLimiting the Rows that Are Updated

En los ejemplos de esta sección se muestran varias formas de limitar el número de filas afectadas por la instrucción UPDATE.Examples in this section demonstrate ways that you can use to limit the number of rows affected by the UPDATE statement.

C.C.Usar la cláusula WHEREUsing the WHERE clause

En el ejemplo siguiente se utiliza la cláusula WHERE para especificar las filas que se van a actualizar.The following example uses the WHERE clause to specify which rows to update.La instrucción actualiza el valor de la columna Color de la tabla Production.Product para todas las filas con un valor existente de 'Red' en la columna Color y con un valor que comience por 'Road-250' en la columna Name.The statement updates the value in the Color column of the Production.Product table for all rows that have an existing value of 'Red' in the Color column and have a value in the Name column that starts with 'Road-250'.

USE AdventureWorks2012;
GO
UPDATE Production.Product
SET Color = N'Metallic Red'
WHERE Name LIKE N'Road-250%' AND Color = N'Red';
GO

D.D.Usar la cláusula TOPUsing the TOP clause

En los siguientes ejemplos use la cláusula TOP para limitar el número de filas que se modifican en una instrucción UPDATE.The following examples use the TOP clause to limit the number of rows that are modified in an UPDATE statement.Cuando una parte superior (n) se utiliza la cláusula con la actualización, la operación de actualización se realiza en una selección aleatoria de 'n' número de filas.When a TOP (n) clause is used with UPDATE, the update operation is performed on a random selection of 'n' number of rows.En el ejemplo siguiente se actualiza un 25 por ciento la columna VacationHours en 10 filas aleatorias de la tabla Employee.The following example updates the VacationHours column by 25 percent for 10 random rows in the Employee table.

Si debe usar TOP para aplicar actualizaciones por orden cronológico, debe utilizarla junto con ORDER BY en una instrucción de subselección.If you must use TOP to apply updates in a meaningful chronology, you must use TOP together with ORDER BY in a subselect statement.En el siguiente ejemplo se actualizan las horas de vacaciones de los 10 empleados cuyas fechas de alta son más antiguas.The following example updates the vacation hours of the 10 employees with the earliest hire dates.

UPDATE HumanResources.Employee
SET VacationHours = VacationHours + 8
FROM (SELECT TOP 10 BusinessEntityID FROM HumanResources.Employee
ORDER BY HireDate ASC) AS th
WHERE HumanResources.Employee.BusinessEntityID = th.BusinessEntityID;
GO

E.E.Usar la cláusula WITH common_table_expressionUsing the WITH common_table_expression clause

F.F.Usar la cláusula WHERE CURRENT OFUsing the WHERE CURRENT OF clause

En el siguiente ejemplo se usa la cláusula WHERE CURRENT OF para actualizar solo la fila en la que se coloca el cursor.The following example uses the WHERE CURRENT OF clause to update only the row on which the cursor is positioned.Cuando un cursor se basa en una combinación, solo se modifica el table_name especificado en la instrucción UPDATE.When a cursor is based on a join, only the table_name specified in the UPDATE statement is modified.Las demás tablas que participan en el cursor no se ven afectadas.Other tables participating in the cursor are not affected.

USE AdventureWorks2012;
GO
DECLARE complex_cursor CURSOR FOR
SELECT a.BusinessEntityID
FROM HumanResources.EmployeePayHistory AS a
WHERE RateChangeDate <>
(SELECT MAX(RateChangeDate)
FROM HumanResources.EmployeePayHistory AS b
WHERE a.BusinessEntityID = b.BusinessEntityID) ;
OPEN complex_cursor;
FETCH FROM complex_cursor;
UPDATE HumanResources.EmployeePayHistory
SET PayFrequency = 2
WHERE CURRENT OF complex_cursor;
CLOSE complex_cursor;
DEALLOCATE complex_cursor;
GO

USE AdventureWorks2012;
GO
UPDATE Sales.SalesPerson
SET SalesYTD = SalesYTD +
(SELECT SUM(so.SubTotal)
FROM Sales.SalesOrderHeader AS so
WHERE so.OrderDate = (SELECT MAX(OrderDate)
FROM Sales.SalesOrderHeader AS so2
WHERE so2.SalesPersonID = so.SalesPersonID)
AND Sales.SalesPerson.BusinessEntityID = so.SalesPersonID
GROUP BY so.SalesPersonID);
GO

En el ejemplo anterior se asume que solo se registra una venta para un determinado vendedor en una fecha determinada y que las actualizaciones son recientes.The previous example assumes that only one sale is recorded for a specified salesperson on a specific date and that updates are current.Si se puede registrar más de una venta para un vendedor determinado el mismo día, el ejemplo que se muestra no funcionará correctamente.If more than one sale for a specified salesperson can be recorded on the same day, the example shown does not work correctly.El ejemplo se ejecuta sin errores, pero cada SalesYTD valor se actualiza con solo una venta, independientemente de cuántas ventas realmente se ha producido ese día.The example runs without error, but each SalesYTD value is updated with only one sale, regardless of how many sales actually occurred on that day.Esto es debido a que una sola instrucción UPDATE nunca actualiza la misma fila dos veces.This is because a single UPDATE statement never updates the same row two times.

En el caso de más de una venta para un vendedor especificado puede tener lugar en el mismo día, todas las ventas de cada vendedor deben agregarse juntos en el UPDATE instrucción, como se muestra en el ejemplo siguiente:In the situation in which more than one sale for a specified salesperson can occur on the same day, all the sales for each sales person must be aggregated together within the UPDATE statement, as shown in the following example:

USE AdventureWorks2012;
GO
UPDATE Sales.SalesPerson
SET SalesYTD = SalesYTD +
(SELECT SUM(so.SubTotal)
FROM Sales.SalesOrderHeader AS so
WHERE so.OrderDate = (SELECT MAX(OrderDate)
FROM Sales.SalesOrderHeader AS so2
WHERE so2.SalesPersonID = so.SalesPersonID)
AND Sales.SalesPerson.BusinessEntityID = so.SalesPersonID
GROUP BY so.SalesPersonID);
GO

Los siguientes ejemplos se muestra cómo pueden verse afectadas todas las filas cuando una cláusula WHERE no se utiliza para especificar la fila (o filas) para actualizar.The following examples show how all rows can be affected when a WHERE clause is not used to specify the row (or rows) to update.

Es posible que tener una actualización compleja que combina más de dos tablas juntos mediante sintaxis de unión de ANSI para realizar la actualización o eliminación.You may find you have a complex update that joins more than two tables together using ANSI joining syntax to perform the UPDATE or DELETE.

Imagine que había que actualizar esta tabla:Imagine you had to update this table:

Puesto que Almacenamiento de datos SQLSQL Data Warehouse no admite combinaciones ANSI en la cláusula FROM de una instrucción UPDATE, no se puede copiar este código a través sin cambiar ligeramente.Since Almacenamiento de datos SQLSQL Data Warehouse does not support ANSI joins in the FROM clause of an UPDATE statement, you cannot copy this code over without changing it slightly.

Puede utilizar una combinación de un CTAS y una combinación implícita para reemplazar este código:You can use a combination of a CTAS and an implicit join to replace this code: