UPDATE (Transact-SQL)UPDATE (Transact-SQL)

ESTE TEMA SE APLICA A: síSQL Server (a partir de 2008)síAzure SQL DatabasesíAzure SQL Data Warehouse síAlmacenamiento de datos paralelos THIS TOPIC APPLIES TO: yesSQL Server (starting with 2008)yesAzure SQL DatabaseyesAzure SQL Data Warehouse yesParallel Data Warehouse

Cambia los datos de una tabla o vista de SQL Server 2017SQL Server 2017.Changes existing data in a table or view in SQL Server 2017SQL Server 2017. Para obtener ejemplos, vea ejemplos.For examples, see Examples.

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  

[ WITH <common_table_expression> [...n] ]  
UPDATE   
    [ TOP ( expression ) [ PERCENT ] ]   
    { { table_alias | <object> | rowset_function_limited   
         [ WITH ( <Table_Hint_Limited> [ ...n ] ) ]  
      }  
      | @table_variable      
    }  
    SET  
        { column_name = { expression | DEFAULT | NULL }  
          | { udt_column_name.{ { property_name = expression  
                                | field_name = expression }  
                                | method_name ( argument [ ,...n ] )  
                              }  
          }  
          | column_name { .WRITE ( expression , @Offset , @Length ) }  
          | @variable = expression  
          | @variable = column = expression  
          | column_name { += | -= | *= | /= | %= | &= | ^= | |= } expression  
          | @variable { += | -= | *= | /= | %= | &= | ^= | |= } expression  
          | @variable = column { += | -= | *= | /= | %= | &= | ^= | |= } expression  
        } [ ,...n ]   

    [ <OUTPUT Clause> ]  
    [ FROM{ <table_source> } [ ,...n ] ]   
    [ WHERE { <search_condition>   
            | { [ CURRENT OF   
                  { { [ GLOBAL ] cursor_name }   
                      | cursor_variable_name   
                  }   
                ]  
              }  
            }   
    ]   
    [ OPTION ( <query_hint> [ ,...n ] ) ]  
[ ; ]  

<object> ::=  
{   
    [ server_name . database_name . schema_name .   
    | database_name .[ schema_name ] .   
    | schema_name .  
    ]  
    table_or_view_name}  
-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse  

UPDATE [ database_name . [ schema_name ] . | schema_name . ] table_name   
SET { column_name = { expression | NULL } } [ ,...n ]  
[ FROM from_clause ]  
[ WHERE <search_condition> ]   
[ OPTION ( LABEL = label_name ) ]  
[;]  

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.

Las expresiones de tabla comunes también se pueden utilizar con las instrucciones SELECT, INSERT, DELETE y CREATE VIEW.Common table expressions can also be used with the SELECT, INSERT, DELETE, and CREATE VIEW statements. Para obtener más información, consulte con common_table_expression ( Transact-SQL ) .For more information, see WITH common_table_expression (Transact-SQL).

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.

Utilizar paréntesis para delimitar expresión en la parte superior se requieren en instrucciones INSERT, UPDATE y DELETE.Parentheses delimiting expression in TOP are required in INSERT, UPDATE, and DELETE statements. Para obtener más información, vea TOP ( Transact-SQL ) .For more information, see TOP (Transact-SQL).

table_aliastable_alias
Alias 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.

server_nameserver_name
Es el nombre del servidor (con un nombre de servidor vinculado o OPENDATASOURCE funcionar como el nombre del servidor) en el que se encuentra la tabla o vista.Is the name of the server (using a linked server name or the OPENDATASOURCE function as the server name) on which the table or view is located. Si nombre_servidor se especifica, database_name y schema_name son necesarios.If server_name is specified, database_name and schema_name are required.

database_namedatabase_name
Es el nombre de la base de datos.Is the name of the database.

schema_nameschema_name
Es el nombre del esquema al que pertenece la tabla o la vista.Is the name of the schema to which the table or view belongs.

view_name table_ortable_or view_name
Es el nombre de la tabla o vista cuyas filas se deben actualizar.Is the name of the table or view from which the rows are to be updated. La vista hace referencia a nombre_tabla_o_vista debe ser actualizable y referencia exactamente a una tabla base en la cláusula FROM de la vista.The view referenced by table_or_view_name must be updatable and reference exactly one base table in the FROM clause of the view. Para obtener más información acerca de las vistas actualizables, vea CREATE VIEW ( Transact-SQL ) .For more information about updatable views, see CREATE VIEW (Transact-SQL).

rowset_function_limitedrowset_function_limited
Es el OPENQUERY o OPENROWSET función, dependiendo del proveedor.Is either the OPENQUERY or OPENROWSET function, subject to provider capabilities.

WITH ( <Table_Hint_Limited> )WITH ( <Table_Hint_Limited> )
Especifica una o varias sugerencias de tabla que están permitidas en una tabla de destino.Specifies one or more table hints that are allowed for a target table. La palabra clave WITH y los paréntesis son obligatorios.The WITH keyword and the parentheses are required. No se permiten NOLOCK ni READUNCOMMITTED.NOLOCK and READUNCOMMITTED are not allowed. Para obtener información acerca de las sugerencias de tabla, vea sugerencias de tabla ( Transact-SQL ) .For information about table hints, see Table Hints (Transact-SQL).

@table_variable@table_variable
Especifica un tabla variable como una tabla de origen.Specifies a table variable as a table source.

SETSET
Especifica la lista de nombres de variable o de columna que se van a actualizar.Specifies the list of column or variable names to be updated.

column_namecolumn_name
Es una columna que contiene los datos que se van a cambiar.Is a column that contains the data to be changed. column_name debe existir en table_or view_name.column_name must exist in table_or view_name. Las columnas de identidad no se pueden actualizar.Identity columns cannot be updated.

expressionexpression
Es una variable, un valor literal, una expresión o una instrucción de subselección entre paréntesis que devuelve un solo valor.Is a variable, literal value, expression, or a subselect statement (enclosed with parentheses) that returns a single value. El valor devuelto por expresión reemplaza al valor existente en column_name o @variable .The value returned by expression replaces the existing value in column_name or @variable.

Nota

Al hacer referencia a los tipos de datos de caracteres Unicode nchar, nvarchar, y ntext, 'expression' debe agregarse como prefijo la letra mayúscula ' n '.When referencing the Unicode character data types nchar, nvarchar, and ntext, 'expression' should be prefixed with the capital letter 'N'. Si no se especifica 'N', SQL ServerSQL Server convierte la cadena a la página de códigos que se corresponde con la intercalación predeterminada de la base de datos o columna.If 'N' is not specified, SQL ServerSQL Server converts the string to the code page that corresponds to the default collation of the database or column. Los caracteres que no se encuentren en esta página de códigos se perderán.Any characters not found in this code page are lost.

DEFAULTDEFAULT
Especifica que el valor predeterminado definido para la columna debe reemplazar al valor existente en esa columna.Specifies that the default value defined for the column is to replace the existing value in the column. Esta operación también puede utilizarse para cambiar la columna a NULL si no tiene asignado ningún valor predeterminado y se ha definido para aceptar valores NULL.This can also be used to change the column to NULL if the column has no default and is defined to allow null values.

{ += | -= | *= | /= | %= | &= | ^= | |= }{ += | -= | *= | /= | %= | &= | ^= | |= }
Operador de asignación compuesta:Compound assignment operator:
+= Sumar y asignar+= Add and assign
-= Restar y asignar-= Subtract and assign
*= Multiplicar y asignar*= Multiply and assign
/ = Dividir y asignar/= Divide and assign
% = Módulo y asignar%= Modulo and assign
& = AND bit a bit y asignar&= Bitwise AND and assign
^ = XOR bit a bit y asignar^= Bitwise XOR and assign
| = OR bit a bit y asignar|= Bitwise OR and assign

udt_column_nameudt_column_name
Es una columna de un tipo definido por el usuario.Is a user-defined type column.

property_name | field_nameproperty_name | field_name
Es un miembro de propiedad público o un miembro de datos público de un tipo definido por el usuario.Is a public property or public data member of a user-defined type.

method_name ( argument [ ,... n] )method_name ( argument [ ,... n] )
Es un método mutador público no estático de udt_column_name que toma uno o más argumentos.Is a nonstatic public mutator method of udt_column_name that takes one or more arguments.

. Escribir (expresión,@Offset,@Length).WRITE (expression,@Offset,@Length)
Especifica que una sección del valor de column_name consiste en modificar.Specifies that a section of the value of column_name is to be modified. expresión reemplaza @Length unidades desde @Offset de column_name.expression replaces @Length units starting from @Offset of column_name. Solo las columnas de varchar (max), nvarchar (max), o varbinary (max) puede especificarse con esta cláusula.Only columns of varchar(max), nvarchar(max), or varbinary(max) can be specified with this clause. column_name no puede ser NULL y no se puede calificar con un nombre de tabla o el alias de la tabla.column_name cannot be NULL and cannot be qualified with a table name or table alias.

expresión es el valor que se copia en column_name.expression is the value that is copied to column_name. expresión debe evaluar, o que pueda convertirse implícitamente a la column_name tipo.expression must evaluate to or be able to be implicitly cast to the column_name type. Si expresión se establece en NULL, @Length se omite y el valor de column_name se trunca en el índice especificado @Offset .If expression is set to NULL, @Length is ignored, and the value in column_name is truncated at the specified @Offset.

@Offsetes el punto inicial en el valor de column_name en el que expresión se escribe.@Offset is the starting point in the value of column_name at which expression is written. @Offsetes una posición ordinal basado en cero, es bigint, y no puede ser un número negativo.@Offset is a zero-based ordinal position, is bigint, and cannot be a negative number. Si @Offset es NULL, la operación de actualización anexa expresión al final de la existente column_name valor y @Length se omite.If @Offset is NULL, the update operation appends expression at the end of the existing column_name value and @Length is ignored. Si @Offset es mayor que la longitud de la column_name valor, el Motor de base de datosDatabase Engine devuelve un error.If @Offset is greater than the length of the column_name value, the Motor de base de datosDatabase Engine returns an error. Si @Offset más @Length excede el final del valor subyacente de la columna, la eliminación produce hasta hasta el último carácter del valor.If @Offset plus @Length exceeds the end of the underlying value in the column, the deletion occurs up to the last character of the value. Si @Offset plus LEN (expresión) es mayor que subyacente declarado tamaño, se produce un error.If @Offset plus LEN(expression) is greater than the underlying declared size, an error is raised.

@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.

Para obtener más información, vea la sección Comentarios.For more information, see Remarks.

@variable@ variable
Es una variable declarada a la que se establece en el valor devuelto por expresión.Is a declared variable that is set to the value returned by expression.

ESTABLECER @* variable* = columna = expresión establece la variable en el mismo valor que la columna.SET @variable = column = expression sets the variable to the same value as the column. Esto difiere del conjunto @* variable* = columna, columna = expresión, que establece el variable con el valor anterior a la actualización de la columna.This differs from SET @variable = column, column = expression, which sets the variable to the pre-update value of the column.

<OUTPUT_Clause><OUTPUT_Clause>
Devuelve datos actualizados o expresiones basadas en ellos como parte de la operación UPDATE.Returns updated data or expressions based on it as part of the UPDATE operation. La cláusula OUTPUT no se admite en instrucciones DML dirigidas a tablas o vistas remotas.The OUTPUT clause is not supported in any DML statements that target remote tables or views. Para obtener más información, vea cláusula OUTPUT ( Transact-SQL ) .For more information, see OUTPUT Clause (Transact-SQL).

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.

WHEREWHERE
Especifica 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 por búsqueda especifican una condición de búsqueda para calificar las filas que se van a eliminar.Searched updates specify a search condition to qualify the rows to delete.

  • 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 OF
Indica 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.

GLOBALGLOBAL
Especifica que cursor_name hace referencia a un cursor global.Specifies that cursor_name refers to a global cursor.

cursor_namecursor_name
Es 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_name
Es 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.

OPCIÓN ( <query_hint > [ ,... n ] )OPTION ( <query_hint> [ ,... n ] )
Especifica que se utilizan las sugerencias del optimizador para personalizar el modo en que el Motor de base de datosDatabase Engine procesa la instrucción.Specifies that optimizer hints are used to customize the way the Motor de base de datosDatabase Engine processes the statement. Para obtener más información, vea Sugerencias de consulta (Transact-SQL).For more information, see Query Hints (Transact-SQL).

Procedimientos recomendadosBest Practices

Use el @@ROWCOUNT insertado de función para devolver el número de filas a la aplicación cliente.Use the @@ROWCOUNT function to return the number of inserted rows to the client application. Para obtener más información, consulte @@ROWCOUNT ( Transact-SQL ) .For more information, see @@ROWCOUNT (Transact-SQL).

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.

USE AdventureWorks2012;  
GO  
IF OBJECT_ID ('dbo.Table1', 'U') IS NOT NULL  
    DROP TABLE dbo.Table1;  
GO  
IF OBJECT_ID ('dbo.Table2', 'U') IS NOT NULL  
    DROP TABLE dbo.Table2;  
GO  
CREATE TABLE dbo.Table1   
    (ColA int NOT NULL, ColB decimal(10,3) NOT NULL);  
GO  
CREATE TABLE dbo.Table2   
    (ColA int PRIMARY KEY NOT NULL, ColB decimal(10,3) NOT NULL);  
GO  
INSERT INTO dbo.Table1 VALUES(1, 10.0), (1, 20.0);  
INSERT INTO dbo.Table2 VALUES(1, 0.0);  
GO  
UPDATE dbo.Table2   
SET dbo.Table2.ColB = dbo.Table2.ColB + dbo.Table1.ColB  
FROM dbo.Table2   
    INNER JOIN dbo.Table1   
    ON (dbo.Table2.ColA = dbo.Table1.ColA);  
GO  
SELECT ColA, ColB   
FROM dbo.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.

USE AdventureWorks2012;  
GO  
IF OBJECT_ID ('dbo.Table1', 'U') IS NOT NULL  
    DROP TABLE dbo.Table1;  
GO  
IF OBJECT_ID ('dbo.Table2', 'U') IS NOT NULL  
    DROP TABLE dbo.Table2;  
GO  
CREATE TABLE dbo.Table1  
    (c1 int PRIMARY KEY NOT NULL, c2 int NOT NULL);  
GO  
CREATE TABLE dbo.Table2  
    (d1 int PRIMARY KEY NOT NULL, d2 int NOT NULL);  
GO  
INSERT INTO dbo.Table1 VALUES (1, 10);  
INSERT INTO dbo.Table2 VALUES (1, 20), (2, 30);  
GO  
DECLARE abc CURSOR LOCAL FOR  
    SELECT c1, c2   
    FROM dbo.Table1;  
OPEN abc;  
FETCH abc;  
UPDATE dbo.Table1   
SET c2 = c2 + d2   
FROM dbo.Table2   
WHERE CURRENT OF abc;  
GO  
SELECT c1, c2 FROM dbo.Table1;  
GO  

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.

Tipos de datosData Types

Todos los char y nchar columnas son rellenado a la derecha hasta la longitud definida.All char and nchar columns are right-padded to the defined length.

Si ANSI_PADDING se establece en OFF, se quitan todos los espacios finales de los datos insertados en varchar y nvarchar columnas, excepto en las cadenas que contienen solo espacios.If ANSI_PADDING is set to OFF, all trailing spaces are removed from data inserted into varchar and nvarchar columns, except in strings that contain only spaces. Estas cadenas se truncan en una cadena vacía.These strings are truncated to an empty string. Si ANSI_PADDING se establece en ON, se insertan espacios al final.If ANSI_PADDING is set to ON, trailing spaces are inserted. El controlador ODBC de Microsoft SQL Server y el proveedor OLE DB para SQL Server establecen automáticamente SET ANSI_PADDING en ON para cada conexión.The Microsoft SQL Server ODBC driver and OLE DB Provider for SQL Server automatically set ANSI_PADDING ON for each connection. Se puede configurar en orígenes de datos ODBC o mediante atributos o propiedades de conexión.This can be configured in ODBC data sources or by setting connection attributes or properties. Para obtener más información, vea SET ANSI_PADDING (Transact-SQL).For more information, see SET ANSI_PADDING (Transact-SQL).

Actualizar columnas de tipo text, ntext e imageUpdating text, ntext, and image Columns

Modificar un texto, ntext, o imagen columna con UPDATE inicializa la columna, le asigna un puntero de texto válido y asigna al menos una página de datos, a menos que el se está actualizando la columna con el valor NULL.Modifying a text, ntext, or image column with UPDATE initializes the column, assigns a valid text pointer to it, and allocates at least one data page, unless the column is being updated with NULL.

Para reemplazar o modificar bloques grandes de texto, ntext, o imagen datos, usar WRITETEXT o UPDATETEXT en lugar de la instrucción UPDATE.To replace or modify large blocks of text, ntext, or image data, use WRITETEXT or UPDATETEXT instead of the UPDATE statement.

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.

Importante

El ntext, texto, y imagen tipos de datos se quitará en una versión futura de MicrosoftMicrosoft SQL ServerSQL Server.The ntext, text, and image data types will be removed in a future version of MicrosoftMicrosoft SQL ServerSQL Server. Evite su uso en nuevos trabajos de desarrollo y piense en modificar las aplicaciones que los usan actualmente.Avoid using these data types in new development work, and plan to modify applications that currently use them. Use nvarchar(max), varchar(max)y varbinary(max) en su lugar.Use nvarchar(max), varchar(max), and varbinary(max) instead.

Actualizar tipos de datos de valores grandesUpdating Large Value Data Types

Use la . ESCRIBIR (expresión ***** *@Offset,@Length) cláusula para realizar una actualización parcial o completa de varchar (max), nvarchar (max), y varbinary (max) tipos de datos.Use the .WRITE (expression, @Offset,@Length) clause to perform a partial or full update of varchar(max), nvarchar(max), and varbinary(max) data types. Por ejemplo, una actualización parcial de un varchar (max) columna podría eliminar o modificar solo los primeros 200 caracteres de la columna, mientras que una actualización completa eliminaría o modificaría todos los datos de la columna.For example, a partial update of a varchar(max) column might delete or modify only the first 200 characters of the column, whereas a full update would delete or modify all the data in the column. . WRITE que insertan o anexa datos nuevos se registra mínimamente si el modelo de recuperación de base de datos está establecido para registro masivo o simple..WRITE updates that insert or append new data are minimally logged if the database recovery model is set to bulk-logged or simple. El registro mínimo no se utiliza cuando se actualizan los datos existentes.Minimal logging is not used when existing values are updated. Para obtener más información, vea El registro de transacciones (SQL Server).For more information, see The Transaction Log (SQL Server).

El Motor de base de datosDatabase Engine convierte una actualización parcial en actualización completa cuando la instrucción UPDATE realiza una de estas acciones:The Motor de base de datosDatabase Engine converts a partial update to a full update when the UPDATE statement causes either of these actions:

  • Cambia una columna de clave de la tabla o vista con particiones.Changes a key column of the partitioned view or table.
  • 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.

@Offsety @Length se especifican en bytes para varbinary y varchar tipos de datos y en caracteres para la nvarchartipo de datos.@Offset and @Length are specified in bytes for varbinary and varchar data types and in characters for the nvarchar data type. Se calculan los desplazamientos correspondientes para las intercalaciones del juego de caracteres de doble byte (DBCS).The appropriate offsets are computed for double-byte character set (DBCS) collations.

Para que el rendimiento sea óptimo, se recomienda insertar o actualizar los datos en tamaños de fragmento que sean múltiplos de 8.040 bytes.For best performance, we recommend that data be inserted or updated in chunk sizes that are multiples of 8040 bytes.

Si la columna modificada por la . ESCRIBIR cláusula se hace referencia en una cláusula OUTPUT, el valor completo de la columna, ya sea la imagen anterior de eliminado. *** column_name* o la imagen posterior de *insertar. *** column_name, se devuelve a la columna especificada en la variable de tabla.If the column modified by the **.WRITE clause is referenced in an OUTPUT clause, the complete value of the column, either the before image in deleted.column_name or the after image in inserted.column_name, is returned to the specified column in the table variable. Vea el ejemplo R que sigue.See example R that follows.

Para lograr la misma funcionalidad de . ESCRIBIR por otro carácter o tipos de datos binarios, utilice la cosas ( Transact-SQL ) .To achieve the same functionality of .WRITE with other character or binary data types, use the STUFF (Transact-SQL).

Actualizar columnas de tipos definidos por el usuarioUpdating User-defined Type Columns

Hay varios métodos para actualizar los valores de columnas de tipos definidos por el usuario:Updating values in user-defined type columns can be accomplished in one of the following ways:

  • Suministrar un valor de un tipo de datos del sistema de SQL ServerSQL Server, siempre y cuando el tipo definido por el usuario admita la conversión implícita o explícita desde ese tipo.Supplying a value in a SQL ServerSQL Server system data type, as long as the user-defined type supports implicit or explicit conversion from that type. En el ejemplo siguiente se muestra cómo actualizar un valor de una columna de tipo Point, definido por el usuario, mediante la conversión explícita de una cadena.The following example shows how to update a value in a column of user-defined type Point, by explicitly converting from a string.

    UPDATE Cities  
    SET Location = CONVERT(Point, '12.3:46.2')  
    WHERE Name = 'Anchorage';  
    
  • Invocar un método, marcado como mutator, del tipo definido por el usuario, para realizar la actualización.Invoking a method, marked as a mutator, of the user-defined type, to perform the update. En el ejemplo siguiente se invoca un método mutador de tipo Point denominado SetXY.The following example invokes a mutator method of type Point named SetXY. Esto actualiza el estado de la instancia del tipo.This updates the state of the instance of the type.

    UPDATE Cities  
    SET Location.SetXY(23.5, 23.5)  
    WHERE Name = 'Anchorage';  
    

    Nota

    SQL ServerSQL Server devuelve un error si se invoca un método mutador en un valor NULL de Transact-SQLTransact-SQL, o si un nuevo valor producido por un método mutador es NULL. returns an error if a mutator method is invoked on a Transact-SQLTransact-SQL null value, or if a new value produced by a mutator method is null.

  • Modificar el valor de un miembro de propiedad registrado o un miembro de datos público del tipo definido por el usuario.Modifying the value of a registered property or public data member of the user-defined type. La expresión que suministra el valor debe poder convertirse implícitamente al tipo de la propiedad.The expression supplying the value must be implicitly convertible to the type of the property. En el ejemplo siguiente se modifica el valor de la propiedad X del tipo Point definido por el usuario.The following example modifies the value of property X of user-defined type Point.

    UPDATE Cities  
    SET Location.X = 23.5  
    WHERE Name = 'Anchorage';  
    

    Para modificar diferentes propiedades de la misma columna de tipo definido por el usuario, emita varias instrucciones UPDATE o invoque un método mutador del tipo.To modify different properties of the same user-defined type column, issue multiple UPDATE statements, or invoke a mutator method of the type.

Actualizar datos FILESTREAMUpdating FILESTREAM Data

Puede utilizar la instrucción UPDATE para actualizar un campo FILESTREAM de forma que tenga un valor nulo, un valor vacío o una cantidad relativamente pequeña de datos insertados.You can use the UPDATE statement to update a FILESTREAM field to a null value, empty value, or a relatively small amount of inline data. Sin embargo, se envía una gran cantidad de datos de manera más eficaz en un archivo si se utilizan interfaces de Win32.However, a large amount of data is more efficiently streamed into a file by using Win32 interfaces. Al actualizar un campo FILESTREAM, modifica los datos de BLOB subyacentes en el sistema de archivos.When you update a FILESTREAM field, you modify the underlying BLOB data in the file system. Cuando un campo FILESTREAM está establecido en NULL, se eliminan los datos de BLOB asociados al campo.When a FILESTREAM field is set to NULL, the BLOB data associated with the field is deleted. No se puede usar. Write() para realizar actualizaciones parciales de los datos de FILESTREAM.You cannot use .WRITE(), to perform partial updates to FILESTREAM data. Para obtener más información, vea FILESTREAM (SQL Server).For more information, see FILESTREAM (SQL Server).

Tratamiento de erroresError Handling

Si la actualización de una fila infringe una restricción o una regla, infringe la configuración de valores NULL de la columna o, si el nuevo valor es de un tipo de datos incompatible, se cancela la instrucción, se devuelve un error y no se actualiza ningún registro.If an update to a row violates a constraint or rule, violates the NULL setting for the column, or the new value is an incompatible data type, the statement is canceled, an error is returned, and no records are updated.

Cuando una instrucción UPDATE encuentra un error aritmético (error de desbordamiento, división por cero o de dominio) durante la evaluación de la expresión, la actualización no se lleva a cabo.When an UPDATE statement encounters an arithmetic error (overflow, divide by zero, or a domain error) during expression evaluation, the update is not performed. El resto del lote no se ejecuta y se devuelve un mensaje de error.The rest of the batch is not executed, and an error message is returned.

Si la actualización de una o varias columnas que participan en un índice clúster hace que el tamaño del mismo y de la fila supere 8.060 bytes, la actualización no se produce y se devuelve un mensaje de error.If an update to a column or columns participating in a clustered index causes the size of the clustered index and the row to exceed 8,060 bytes, the update fails and an error message is returned.

InteroperabilidadInteroperability

Se pueden utilizar instrucciones UPDATE en el cuerpo de las funciones definidas por el usuario solamente si la tabla que se modifica es una variable de tabla.UPDATE statements are allowed in the body of user-defined functions only if the table being modified is a table variable.

Cuando se define un desencadenador INSTEAD OF para las acciones UPDATE de una tabla, se ejecuta el desencadenador en lugar de la instrucción UPDATE.When an INSTEAD OF trigger is defined on UPDATE actions against a table, the trigger is running instead of the UPDATE statement. En versiones anteriores de SQL ServerSQL Server solo se admite la definición de desencadenadores AFTER en instrucciones UPDATE y otras instrucciones de modificación de datos.Earlier versions of SQL ServerSQL Server only support AFTER triggers defined on UPDATE and other data modification statements. No se puede especificar la cláusula FROM en una instrucción UPDATE que haga referencia, directa o indirectamente, a una vista que tenga definido un desencadenador INSTEAD OF.The FROM clause cannot be specified in an UPDATE statement that references, either directly or indirectly, a view with an INSTEAD OF trigger defined on it. Para obtener más información acerca de desencadenadores INSTEAD OF, vea CREATE TRIGGER ( Transact-SQL ) .For more information about INSTEAD OF triggers, see CREATE TRIGGER (Transact-SQL).

Limitaciones y restriccionesLimitations and Restrictions

No se puede especificar la cláusula FROM de una instrucción UPDATE que hace referencia, directa o indirectamente, una vista que tiene un desencadenador INSTEAD OF definido en él.The FROM clause cannot be specified in an UPDATE statement that references, either directly or indirectly, a view that has an INSTEAD OF trigger defined on it. Para obtener más información acerca de desencadenadores INSTEAD OF, vea CREATE TRIGGER ( Transact-SQL ) .For more information about INSTEAD OF triggers, see CREATE TRIGGER (Transact-SQL).

Cuando una expresión de tabla común (CTE) es el destino de una instrucción UPDATE, todas las referencias a la CTE de la instrucción deben coincidir.When a common table expression (CTE) is the target of an UPDATE statement, all references to the CTE in the statement must match. Por ejemplo, si la CTE tiene asignado un alias en la cláusula FROM, el alias se debe utilizar para obtener todas las otras referencias a la CTE.For example, if the CTE is assigned an alias in the FROM clause, the alias must be used for all other references to the CTE. Se requieren referencias CTE inequívocas porque una CTE no tiene un objeto ID, que utiliza SQL ServerSQL Server para reconocer la relación implícita entre un objeto y su alias.Unambiguous CTE references are required because a CTE does not have an object ID, which SQL ServerSQL Server uses to recognize the implicit relationship between an object and its alias. Sin esta relación, el plan de consulta puede producir un comportamiento de la unión inesperado y resultados imprevistos de la consulta.Without this relationship, the query plan may produce unexpected join behavior and unintended query results. Los ejemplos siguientes muestran métodos correctos e incorrectos de especificar una CTE cuando la CTE es el objeto de destino de la operación de actualización.The following examples demonstrate correct and incorrect methods of specifying a CTE when the CTE is the target object of the update operation.

USE tempdb;  
GO  
-- UPDATE statement with CTE references that are correctly matched.  
DECLARE @x TABLE (ID int, Value int);  
DECLARE @y TABLE (ID int, Value int);  
INSERT @x VALUES (1, 10), (2, 20);  
INSERT @y VALUES (1, 100),(2, 200);  

WITH cte AS (SELECT * FROM @x)  
UPDATE x -- cte is referenced by the alias.  
SET Value = y.Value  
FROM cte AS x  -- cte is assigned an alias.  
INNER JOIN @y AS y ON y.ID = x.ID;  
SELECT * FROM @x;  
GO  

El conjunto de resultados es el siguiente.Here is the result set.

ID     Value  
------ -----  
1      100  
2      200  
(2 row(s) affected)  

Instrucción UPDATE con referencias CTE que se hacen coincidir de forma incorrecta.UPDATE statement with CTE references that are incorrectly matched.

USE tempdb;  
GO  
DECLARE @x TABLE (ID int, Value int);  
DECLARE @y TABLE (ID int, Value int);  
INSERT @x VALUES (1, 10), (2, 20);  
INSERT @y VALUES (1, 100),(2, 200);  

WITH cte AS (SELECT * FROM @x)  
UPDATE cte   -- cte is not referenced by the alias.  
SET Value = y.Value  
FROM cte AS x  -- cte is assigned an alias.  
INNER JOIN @y AS y ON y.ID = x.ID;   
SELECT * FROM @x;   
GO  

El conjunto de resultados es el siguiente.Here is the result set.

ID     Value  
------ -----  
1      100  
2      100  
(2 row(s) affected)  

Comportamiento del bloqueoLocking Behavior

Una instrucción UPDATE siempre adquiere un bloqueo exclusivo (X) en la tabla que modifica y retiene ese bloqueo hasta que se completa la transacción.An UPDATE statement always acquires an exclusive (X) lock on the table it modifies, and holds that lock until the transaction completes. Con un bloqueo exclusivo, ninguna otra transacción puede modificar los datos.With an exclusive lock, no other transactions can modify data. Puede especificar sugerencias de tabla para invalidar este comportamiento predeterminado durante la ejecución de la instrucción UPDATE especificando otro método de bloqueo, sin embargo se recomienda que solo los desarrolladores y administradores de bases de datos experimentados usen las sugerencias y únicamente como último recurso.You can specify table hints to override this default behavior for the duration of the UPDATE statement by specifying another locking method, however, we recommend that hints be used only as a last resort by experienced developers and database administrators. Para obtener más información, vea Sugerencias de tabla (Transact-SQL).For more information, see Table Hints (Transact-SQL).

Comportamiento del registroLogging Behavior

La instrucción UPDATE se registra; Sin embargo, las actualizaciones parciales de tipos de datos de valores grandes mediante la . ESCRIBIR la cláusula se registran mínimamente.The UPDATE statement is logged; however, partial updates to large value data types using the .WRITE clause are minimally logged. Para obtener más información, vea "Actualizar tipos de datos de valores grandes" en la sección anterior "Tipos de datos".For more information, see "Updating Large Value Data Types" in the earlier section “Data Types”.

SeguridadSecurity

PermissionsPermissions

Se requieren permisos UPDATE en la tabla de destino.UPDATE permissions are required on the target table. Seleccione los permisos también son necesarios para la tabla que se actualiza si la instrucción UPDATE contiene una cláusula WHERE, o si expresión en el conjunto de cláusula utiliza una columna en la tabla.SELECT permissions are also required for the table being updated if the UPDATE statement contains a WHERE clause, or if expression in the SET clause uses a column in the table.

Actualizar permisos de manera predeterminada a los miembros de la sysadmin rol fijo de servidor, el db_owner y db_datawriter se han corregido los roles de base de datos y el propietario de la tabla.UPDATE permissions default to members of the sysadmin fixed server role, the db_owner and db_datawriter fixed database roles, and the table owner. Los miembros de la sysadmin, db_owner, y db_securityadmin roles y el propietario de la tabla pueden transferir permisos a otros usuarios.Members of the sysadmin, db_owner, and db_securityadmin roles, and the table owner can transfer permissions to other users.

EjemplosExamples

CategoríaCategory Elementos de sintaxis ofrecidosFeatured syntax elements
Sintaxis básicaBasic Syntax UPDATEUPDATE
Limitar las filas que se actualizanLimiting the Rows that Are Updated WHERE • TOP • expresión de tabla común WITH • WHERE CURRENT OFWHERE • TOP • WITH common table expression • WHERE CURRENT OF
Establecer valores de columnaSetting Column Values valores calculados • operadores compuestos • valores predeterminados • subconsultascomputed values • compound operators • default values • subqueries
Especificar objetos de destino que no sean tablas estándaresSpecifying Target Objects Other than Standard Tables vistas • variables de tabla • alias de tablaviews • table variables • table aliases
Actualizar los datos basados en datos procedentes de otras tablasUpdating Data Based on Data From Other Tables FROMFROM
Actualizar las filas de una tabla remotaUpdating Rows in a Remote Table servidor vinculado • OPENQUERY • OPENDATASOURCElinked server • OPENQUERY • OPENDATASOURCE
Actualizar tipos de datos de objetos grandesUpdating Large Object Data Types . ESCRIBIR • OPENROWSET.WRITE • OPENROWSET
Actualizar tipos definidos por el usuarioUpdating User-defined Types Tipos definidos por el usuariouser-defined types
Invalidar el comportamiento predeterminado del optimizador de consultas mediante sugerenciasOverriding the Default Behavior of the Query Optimizer by Using Hints sugerencias de tabla • sugerencias de consultatable hints • query hints
Capturar los resultados de la instrucción UPDATECapturing the Results of the UPDATE Statement Cláusula OUTPUTOUTPUT clause
Usar UPDATE en otras instruccionesUsing UPDATE in Other Statements Procedimientos almacenados • TRY…CATCHStored Procedures • TRY…CATCH

Sintaxis básicaBasic Syntax

Los ejemplos de esta sección demuestran la funcionalidad básica de la instrucción UPDATE con la sintaxis mínima requerida.Examples in this section demonstrate the basic functionality of the UPDATE statement using the minimum required syntax.

A.A. Usar una instrucción UPDATE simpleUsing a simple UPDATE statement

En el ejemplo siguiente se actualiza un solo valor de columna para todas las filas de la tabla Person.Address.The following example updates a single column for all rows in the Person.Address table.

USE AdventureWorks2012;  
GO  
UPDATE Person.Address  
SET ModifiedDate = GETDATE();  

B.B. Actualizar varias columnasUpdating multiple columns

En el siguiente ejemplo se actualizan los valores de las columnas Bonus, CommissionPct y SalesQuota para todas las filas de la tabla SalesPerson.The following example updates the values in the Bonus, CommissionPct, and SalesQuota columns for all rows in the SalesPerson table.

USE AdventureWorks2012;  
GO  
UPDATE Sales.SalesPerson  
SET Bonus = 6000, CommissionPct = .10, SalesQuota = NULL;  
GO  

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.

USE AdventureWorks2012;
GO
UPDATE TOP (10) HumanResources.Employee
SET VacationHours = VacationHours * 1.25 ;
GO  

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

En el siguiente ejemplo se actualiza el valor PerAssemnblyQty para todas las partes y componentes que se utilizan directamente o indirectamente para crear el ProductAssemblyID 800.The following example updates the PerAssemnblyQty value for all parts and components that are used directly or indirectly to create the ProductAssemblyID 800. La expresión de tabla común devuelve una lista jerárquica de elementos que suelen usarse directamente para generar ProductAssemblyID 800 y los elementos que se usan para generar esos componentes y así sucesivamente.The common table expression returns a hierarchical list of parts that are used directly to build ProductAssemblyID 800 and parts that are used to build those components, and so on. Solo se modifican las filas devueltas por la expresión de tabla común.Only the rows returned by the common table expression are modified.

USE AdventureWorks2012;  
GO  
WITH Parts(AssemblyID, ComponentID, PerAssemblyQty, EndDate, ComponentLevel) AS  
(  
    SELECT b.ProductAssemblyID, b.ComponentID, b.PerAssemblyQty,  
        b.EndDate, 0 AS ComponentLevel  
    FROM Production.BillOfMaterials AS b  
    WHERE b.ProductAssemblyID = 800  
          AND b.EndDate IS NULL  
    UNION ALL  
    SELECT bom.ProductAssemblyID, bom.ComponentID, p.PerAssemblyQty,  
        bom.EndDate, ComponentLevel + 1  
    FROM Production.BillOfMaterials AS bom   
        INNER JOIN Parts AS p  
        ON bom.ProductAssemblyID = p.ComponentID  
        AND bom.EndDate IS NULL  
)  
UPDATE Production.BillOfMaterials  
SET PerAssemblyQty = c.PerAssemblyQty * 2  
FROM Production.BillOfMaterials AS c  
JOIN Parts AS d ON c.ProductAssemblyID = d.AssemblyID  
WHERE d.ComponentLevel = 0;  

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  

Establecer valores de columnaSetting Column Values

En los ejemplos de esta sección se muestra la actualización de columnas mediante valores calculados, subconsultas y valores DEFAULT.Examples in this section demonstrate updating columns by using computed values, subqueries, and DEFAULT values.

G.G. Especificar un valor calculadoSpecifying a computed value

En los siguientes ejemplos se usan valores calculados en una instrucción UPDATE.The following examples uses computed values in an UPDATE statement. En el ejemplo se duplica el valor de la columna ListPrice para todas las filas de la tabla Product.The example doubles the value in the ListPrice column for all rows in the Product table.

USE AdventureWorks2012 ;  
GO  
UPDATE Production.Product  
SET ListPrice = ListPrice * 2;  
GO  

H.H. Especificar un operador compuestoSpecifying a compound operator

En el ejemplo siguiente se usa la variable @NewPrice para incrementar el precio de todas las bicicletas rojas, tomando como base el precio actual y sumándole 10.The following example uses the variable @NewPrice to increment the price of all red bicycles by taking the current price and adding 10 to it.

USE AdventureWorks2012;  
GO  
DECLARE @NewPrice int = 10;  
UPDATE Production.Product  
SET ListPrice += @NewPrice  
WHERE Color = N'Red';  
GO  

En el siguiente ejemplo se usa el operador compuesto += para anexar los datos ' - tool malfunction' al valor existente de la columna Name de las filas que tienen un valor de ScrapReasonID comprendido entre 10 y 12.The following example uses the compound operator += to append the data ' - tool malfunction' to the existing value in the column Name for rows that have a ScrapReasonID between 10 and 12.

USE AdventureWorks2012;  
GO  
UPDATE Production.ScrapReason   
SET Name += ' - tool malfunction'  
WHERE ScrapReasonID BETWEEN 10 and 12;  

I.I. Especificar una subconsulta en la cláusula SETSpecifying a subquery in the SET clause

En el siguiente ejemplo se usa una subconsulta en la cláusula SET para determinar el valor usado para actualizar la columna.The following example uses a subquery in the SET clause to determine the value that is used to update the column. La subconsulta debe devolver solo un valor escalar. Es decir, un solo valor por fila.The subquery must return only a scalar value (that is, a single value per row). En el ejemplo se modifica la columna SalesYTD de la tabla SalesPerson para reflejar las ventas más recientes registradas en la tabla SalesOrderHeader.The example modifies the SalesYTD column in the SalesPerson table to reflect the most recent sales recorded in the SalesOrderHeader table. La subconsulta suma las ventas de cada vendedor en la instrucción UPDATE.The subquery aggregates the sales for each salesperson in the UPDATE statement.

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  

J.J. Actualizar las filas con valores DEFAULTUpdating rows using DEFAULT values

En el siguiente ejemplo se establece la columna CostRate en su valor predeterminado (0.00) para todas las filas que tengan un valor de CostRate mayor que 20.00.The following example sets the CostRate column to its default value (0.00) for all rows that have a CostRate value greater than 20.00.

USE AdventureWorks2012;  
GO  
UPDATE Production.Location  
SET CostRate = DEFAULT  
WHERE CostRate > 20.00;  

Especificar objetos de destino que no sean tablas estándaresSpecifying Target Objects Other Than Standard Tables

En los ejemplos de esta sección se muestra cómo actualizar filas especificando una vista, un alias de tabla o una variable de tabla.Examples in this section demonstrate how to update rows by specifying a view, table alias, or table variable.

K.K. Especificar una vista como el objeto de destinoSpecifying a view as the target object

En el siguiente ejemplo se actualizan las filas de la tabla especificando una vista como el objeto de destino.The following example updates rows in a table by specifying a view as the target object. La definición de la vista hace referencia a varias tablas, sin embargo, la instrucción UPDATE se ejecuta correctamente porque hace referencia a columnas de una sola de las tablas subyacentes.The view definition references multiple tables, however, the UPDATE statement succeeds because it references columns from only one of the underlying tables. Se produciría un error en la instrucción UPDATE si se especificaran columnas de ambas tablas.The UPDATE statement would fail if columns from both tables were specified. Para obtener más información, consulte modificar datos mediante una vista.For more information, see Modify Data Through a View.

USE AdventureWorks2012;  
GO  
UPDATE Person.vStateProvinceCountryRegion  
SET CountryRegionName = 'United States of America'  
WHERE CountryRegionName = 'United States';  

L.L. Especificar un alias de tabla como el objeto de destinoSpecifying a table alias as the target object

En el siguiente ejemplo se actualizan las filas de la tabla Production.ScrapReason.The follow example updates rows in the table Production.ScrapReason. El alias de tabla asignado a ScrapReason de la cláusula FROM se especifica como el objeto de destino de la cláusula UPDATE.The table alias assigned to ScrapReason in the FROM clause is specified as the target object in the UPDATE clause.

USE AdventureWorks2012;  
GO  
UPDATE sr  
SET sr.Name += ' - tool malfunction'  
FROM Production.ScrapReason AS sr  
JOIN Production.WorkOrder AS wo   
     ON sr.ScrapReasonID = wo.ScrapReasonID  
     AND wo.ScrappedQty > 300;  

M.M. Especificar una variable de tabla como el objeto de destinoSpecifying a table variable as the target object

En el siguiente ejemplo se actualizan las filas de una variable de tabla.The following example updates rows in a table variable.

USE AdventureWorks2012;  
GO  
-- Create the table variable.  
DECLARE @MyTableVar table(  
    EmpID int NOT NULL,  
    NewVacationHours int,  
    ModifiedDate datetime);  

-- Populate the table variable with employee ID values from HumanResources.Employee.  
INSERT INTO @MyTableVar (EmpID)  
    SELECT BusinessEntityID FROM HumanResources.Employee;  

-- Update columns in the table variable.  
UPDATE @MyTableVar  
SET NewVacationHours = e.VacationHours + 20,  
    ModifiedDate = GETDATE()  
FROM HumanResources.Employee AS e   
WHERE e.BusinessEntityID = EmpID;  

-- Display the results of the UPDATE statement.  
SELECT EmpID, NewVacationHours, ModifiedDate FROM @MyTableVar  
ORDER BY EmpID;  
GO  

Actualizar los datos basados en datos procedentes de otras tablasUpdating Data Based on Data From Other Tables

En los ejemplos de esta sección se muestran métodos para actualizar las filas de una tabla basada en la información de otra.Examples in this section demonstrate methods of updating rows from one table based on information in another table.

N.N. Usar la instrucción UPDATE con información de otra tablaUsing the UPDATE statement with information from another table

En este ejemplo se modifica la columna SalesYTD de la tabla SalesPerson para reflejar las ventas más recientes registradas en la tabla SalesOrderHeader.The following example modifies the SalesYTD column in the SalesPerson table to reflect the most recent sales recorded in the SalesOrderHeader table.

USE AdventureWorks2012;  
GO  
UPDATE Sales.SalesPerson  
SET SalesYTD = SalesYTD + SubTotal  
FROM Sales.SalesPerson AS sp  
JOIN Sales.SalesOrderHeader AS so  
    ON sp.BusinessEntityID = so.SalesPersonID  
    AND so.OrderDate = (SELECT MAX(OrderDate)  
                        FROM Sales.SalesOrderHeader  
                        WHERE SalesPersonID = sp.BusinessEntityID);  
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  

Actualizar las filas de una tabla remotaUpdating Rows in a Remote Table

Ejemplos de esta sección muestra cómo actualizar filas en una tabla de destino remota mediante el uso de un servidor vinculado o un función rowset para hacer referencia a la tabla remota.Examples in this section demonstrate how to update rows in a remote target table by using a linked server or a rowset function to reference the remote table.

O.O. Actualizar datos en una tabla remota con un servidor vinculadoUpdating data in a remote table by using a linked server

En el ejemplo siguiente se actualiza una tabla en un servidor remoto.The following example updates a table on a remote server. El ejemplo comienza creando un vínculo al origen de datos remoto mediante el uso de sp_addlinkedserver.The example begins by creating a link to the remote data source by using sp_addlinkedserver. El nombre del servidor vinculado, MyLinkServer, se especifica después como parte del nombre de objeto de cuatro partes con el formato servidor.catálogo.esquema.objeto.The linked server name, MyLinkServer, is then specified as part of the four-part object name in the form server.catalog.schema.object. Observe que debe especificar un nombre de servidor válido para @datasrc.Note that you must specify a valid server name for @datasrc.

USE master;  
GO  
-- Create a link to the remote data source.   
-- Specify a valid server name for @datasrc as 'server_name' or 'server_nameinstance_name'.  

EXEC sp_addlinkedserver @server = N'MyLinkServer',  
    @srvproduct = N' ',  
    @provider = N'SQLNCLI10',   
    @datasrc = N'<server name>',  
    @catalog = N'AdventureWorks2012';  
GO  
USE AdventureWorks2012;  
GO  
-- Specify the remote data source using a four-part name   
-- in the form linked_server.catalog.schema.object.  

UPDATE MyLinkServer.AdventureWorks2012.HumanResources.Department  
SET GroupName = N'Public Relations'  
WHERE DepartmentID = 4;  

P.P. Actualizar datos en una tabla remota con la función OPENQUERYUpdating data in a remote table by using the OPENQUERY function

En el ejemplo siguiente se actualiza una fila en una tabla remota especificando la OPENQUERY función de conjunto de filas.The following example updates a row in a remote table by specifying the OPENQUERY rowset function. En este ejemplo se usa el nombre del servidor vinculado creado en el ejemplo anterior.The linked server name created in the previous example is used in this example.

UPDATE OPENQUERY (MyLinkServer, 'SELECT GroupName FROM HumanResources.Department WHERE DepartmentID = 4')   
SET GroupName = 'Sales and Marketing';  

Q.Q. Actualizar datos en una tabla remota con la función OPENDATASOURCEUpdating data in a remote table by using the OPENDATASOURCE function

En el ejemplo siguiente se inserta una fila en una tabla remota especificando la OPENDATASOURCE función de conjunto de filas.The following example inserts a row into a remote table by specifying the OPENDATASOURCE rowset function. Especifique un nombre de servidor válido para el origen de datos con el formato nombre_servidor o nombre_servidor ombre_instancia.Specify a valid server name for the data source by using the format server_name or server_name\instance_name. Quizá deba configurar la instancia de SQL ServerSQL Server para las consultas distribuidas ad hoc.You may need to configure the instance of SQL ServerSQL Server for Ad Hoc Distributed Queries. Para obtener más información, consulte ad hoc distributed queries (opción) de configuración de servidor.For more information, see ad hoc distributed queries Server Configuration Option.

UPDATE OPENQUERY (MyLinkServer, 'SELECT GroupName FROM HumanResources.Department WHERE DepartmentID = 4')   
SET GroupName = 'Sales and Marketing';  

Actualizar tipos de datos de objetos grandesUpdating Large Object Data Types

En los ejemplos de esta sección se muestran los métodos de actualización de los valores de columnas definidos con tipos de datos de objetos grandes (LOB).Examples in this section demonstrate methods of updating values in columns that are defined with large object (LOB) data types.

R.R. Usar UPDATE con .WRITE para modificar los datos de una columna de tipo nvarchar(max)Using UPDATE with .WRITE to modify data in an nvarchar(max) column

En el ejemplo siguiente se usa el. Cláusula de escritura para actualizar un valor parcial de DocumentSummary, nvarchar (max) columna en el Production.Document tabla.The following example uses the .WRITE clause to update a partial value in DocumentSummary, an nvarchar(max) column in the Production.Document table. La palabra components se sustituye por la palabra features especificando la palabra sustituta, la ubicación inicial (desplazamiento) de la palabra que se va a sustituir en los datos existentes y el número de caracteres que se va a sustituir (longitud).The word components is replaced with the word features by specifying the replacement word, the starting location (offset) of the word to be replaced in the existing data, and the number of characters to be replaced (length). El ejemplo también utiliza la cláusula OUTPUT para devolver el antes y después de las imágenes de la DocumentSummary columna a la @MyTableVar variable de tabla.The example also uses the OUTPUT clause to return the before and after images of the DocumentSummary column to the @MyTableVar table variable.

USE AdventureWorks2012;  
GO  
DECLARE @MyTableVar table (  
    SummaryBefore nvarchar(max),  
    SummaryAfter nvarchar(max));  
UPDATE Production.Document  
SET DocumentSummary .WRITE (N'features',28,10)  
OUTPUT deleted.DocumentSummary,   
       inserted.DocumentSummary   
    INTO @MyTableVar  
WHERE Title = N'Front Reflector Bracket Installation';  
SELECT SummaryBefore, SummaryAfter   
FROM @MyTableVar;  
GO  

S.S. Usar UPDATE con .WRITE para agregar y quitar datos en una columna de tipo nvarchar(max)Using UPDATE with .WRITE to add and remove data in an nvarchar(max) column

Los ejemplos siguientes, agregar y quitar datos de un nvarchar (max) columna que tiene un valor establecido actualmente en NULL.The following examples add and remove data from an nvarchar(max) column that has a value currently set to NULL. Dado que el. ESCRIBIR la cláusula no se puede usar para modificar una columna es NULL, la columna en primer lugar se rellena con los datos temporales.Because the .WRITE clause cannot be used to modify a NULL column, the column is first populated with temporary data. Después, estos datos se reemplazan por los datos correctos mediante la cláusula .WRITE.This data is then replaced with the correct data by using the .WRITE clause. En los demás ejemplos se anexan datos al final del valor de la columna, se quitan (truncan) los datos de la columna y, por último, se quitan los datos parciales de la columna.The additional examples append data to the end of the column value, remove (truncate) data from the column and, finally, remove partial data from the column. Las instrucciones SELECT muestran la modificación de datos resultante de cada instrucción UPDATE.The SELECT statements display the data modification generated by each UPDATE statement.

USE AdventureWorks2012;  
GO  
-- Replacing NULL value with temporary data.  
UPDATE Production.Document  
SET DocumentSummary = N'Replacing NULL value'  
WHERE Title = N'Crank Arm and Tire Maintenance';  
GO  
SELECT DocumentSummary   
FROM Production.Document  
WHERE Title = N'Crank Arm and Tire Maintenance';  
GO  
-- Replacing temporary data with the correct data. Setting @Length to NULL   
-- truncates all existing data from the @Offset position.  
UPDATE Production.Document  
SET DocumentSummary .WRITE(N'Carefully inspect and maintain the tires and crank arms.',0,NULL)  
WHERE Title = N'Crank Arm and Tire Maintenance';  
GO  
SELECT DocumentSummary   
FROM Production.Document  
WHERE Title = N'Crank Arm and Tire Maintenance';  
GO  
-- Appending additional data to the end of the column by setting   
-- @Offset to NULL.  
UPDATE Production.Document  
SET DocumentSummary .WRITE (N' Appending data to the end of the column.', NULL, 0)  
WHERE Title = N'Crank Arm and Tire Maintenance';  
GO  
SELECT DocumentSummary   
FROM Production.Document  
WHERE Title = N'Crank Arm and Tire Maintenance';  
GO  
-- Removing all data from @Offset to the end of the existing value by   
-- setting expression to NULL.   
UPDATE Production.Document  
SET DocumentSummary .WRITE (NULL, 56, 0)  
WHERE Title = N'Crank Arm and Tire Maintenance';  
GO  
SELECT DocumentSummary   
FROM Production.Document  
WHERE Title = N'Crank Arm and Tire Maintenance';  
GO  
-- Removing partial data beginning at position 9 and ending at   
-- position 21.  
UPDATE Production.Document  
SET DocumentSummary .WRITE ('',9, 12)  
WHERE Title = N'Crank Arm and Tire Maintenance';  
GO  
SELECT DocumentSummary   
FROM Production.Document  
WHERE Title = N'Crank Arm and Tire Maintenance';  
GO  

T.T. Usar UPDATE con OPENROWSET para modificar una columna de tipo varbinary(max)Using UPDATE with OPENROWSET to modify a varbinary(max) column

En el ejemplo siguiente se reemplaza una imagen almacenada en un varbinary (max) columna con una imagen nueva.The following example replaces an existing image stored in a varbinary(max) column with a new image. El OPENROWSET función se utiliza con la opción BULK para cargar la imagen en la columna.The OPENROWSET function is used with the BULK option to load the image into the column. En este ejemplo se da por supuesto que hay un archivo denominado Tires.jpg en la ruta de acceso especificada.This example assumes that a file named Tires.jpg exists in the specified file path.

USE AdventureWorks2012;  
GO  
UPDATE Production.ProductPhoto  
SET ThumbNailPhoto = (  
    SELECT *  
    FROM OPENROWSET(BULK 'c:Tires.jpg', SINGLE_BLOB) AS x )  
WHERE ProductPhotoID = 1;  
GO  

U.U. Usar UPDATE para modificar datos FILESTREAMUsing UPDATE to modify FILESTREAM data

En el siguiente ejemplo se usa la instrucción UPDATE para modificar los datos del archivo del sistema de archivos.The following example uses the UPDATE statement to modify the data in the file system file. No se recomienda este método para transmitir grandes cantidades de datos a un archivo.We do not recommend this method for streaming large amounts of data to a file. Use las interfaces de Win32 adecuadas.Use the appropriate Win32 interfaces. En el ejemplo siguiente se reemplaza cualquier texto del registro del archivo por el texto Xray 1.The following example replaces any text in the file record with the text Xray 1. Para obtener más información, vea FILESTREAM (SQL Server).For more information, see FILESTREAM (SQL Server).

UPDATE Archive.dbo.Records  
SET [Chart] = CAST('Xray 1' as varbinary(max))  
WHERE [SerialNumber] = 2;  

Actualizar tipos definidos por el usuarioUpdating User-defined Types

En los siguientes ejemplos se modifican valores de columnas de tipo definido por el usuario (UDT) CLR.The following examples modify values in CLR user-defined type (UDT) columns. Se muestran tres métodos.Three methods are demonstrated. Para obtener más información acerca de las columnas definidas por el usuario, consulte tipos definidos.For more information about user-defined columns, see CLR User-Defined Types.

V.V. Usar un tipo de datos del sistemaUsing a system data type

Puede actualizar un UDT suministrando un valor en un tipo de datos del sistema de SQL ServerSQL Server, siempre que el tipo definido por el usuario admita la conversión implícita o explícita desde ese tipo.You can update a UDT by supplying a value in a SQL ServerSQL Server system data type, as long as the user-defined type supports implicit or explicit conversion from that type. En el ejemplo siguiente se muestra cómo actualizar un valor de una columna de tipo Point, definido por el usuario, mediante la conversión explícita de una cadena.The following example shows how to update a value in a column of user-defined type Point, by explicitly converting from a string.

UPDATE dbo.Cities  
SET Location = CONVERT(Point, '12.3:46.2')  
WHERE Name = 'Anchorage';  

W.W. Invocar un métodoInvoking a method

Puede actualizar un UDT invocando un método, marcado como mutador, del tipo definido por el usuario, para realizar la actualización.You can update a UDT by invoking a method, marked as a mutator, of the user-defined type, to perform the update. En el ejemplo siguiente se invoca un método mutador de tipo Point denominado SetXY.The following example invokes a mutator method of type Point named SetXY. Esto actualiza el estado de la instancia del tipo.This updates the state of the instance of the type.

UPDATE dbo.Cities  
SET Location.SetXY(23.5, 23.5)  
WHERE Name = 'Anchorage';  

X.X. Modificar el valor de una propiedad o miembro de datosModifying the value of a property or data member

Puede actualizar un UDT modificando el valor de un miembro de datos público o de un miembro de propiedad registrado del tipo definido por el usuario.You can update a UDT by modifying the value of a registered property or public data member of the user-defined type. La expresión que suministra el valor debe poder convertirse implícitamente al tipo de la propiedad.The expression supplying the value must be implicitly convertible to the type of the property. En el ejemplo siguiente se modifica el valor de la propiedad X del tipo Point definido por el usuario.The following example modifies the value of property X of user-defined type Point.

UPDATE dbo.Cities  
SET Location.X = 23.5  
WHERE Name = 'Anchorage';  

Invalidar el comportamiento predeterminado del optimizador de consultas mediante sugerenciasOverriding the Default Behavior of the Query Optimizer by Using Hints

En los ejemplos de esta sección se muestra cómo usar sugerencias de tabla y de consulta para invalidar de forma temporal el comportamiento predeterminado del optimizador de consultas cuando se procesa la instrucción UPDATE.Examples in this section demonstrate how to use table and query hints to temporarily override the default behavior of the query optimizer when processing the UPDATE statement.

Precaución

Como el optimizador de consultas de SQL ServerSQL Server suele seleccionar el mejor plan de ejecución de una consulta, se recomienda que únicamente los administradores de bases de datos y desarrolladores experimentados utilicen las sugerencias como último recurso.Because the SQL ServerSQL Server query optimizer typically selects the best execution plan for a query, we recommend that hints be used only as a last resort by experienced developers and database administrators.

Y.Y. Especificar una sugerencia de tablaSpecifying a table hint

En el ejemplo siguiente se especifica la sugerencia de tabla TABLOCK.The following example specifies the table hint TABLOCK. Esta sugerencia especifica que se aplique un bloqueo compartido a la tabla Production.Product y que se mantenga hasta que finalice la instrucción UPDATE.This hint specifies that a shared lock is taken on the table Production.Product and held until the end of the UPDATE statement.

USE AdventureWorks2012;  
GO  
UPDATE Production.Product  
WITH (TABLOCK)  
SET ListPrice = ListPrice * 1.10  
WHERE ProductNumber LIKE 'BK-%';  
GO  

Z.Z. Especificar una sugerencia de consultaSpecifying a query hint

En el ejemplo siguiente se especifica la sugerencia de consulta OPTIMIZE FOR (@variable) en la instrucción UPDATE.The following example specifies the query hintOPTIMIZE FOR (@variable) in the UPDATE statement. Esta sugerencia indica al optimizador de consultas que use un valor concreto para una variable local cuando la consulta se compile y optimice.This hint instructs the query optimizer to use a particular value for a local variable when the query is compiled and optimized. El valor se utiliza solo durante la optimización de la consulta y no durante la ejecución de la misma.The value is used only during query optimization, and not during query execution.

USE AdventureWorks2012;  
GO  
CREATE PROCEDURE Production.uspProductUpdate  
@Product nvarchar(25)  
AS  
SET NOCOUNT ON;  
UPDATE Production.Product  
SET ListPrice = ListPrice * 1.10  
WHERE ProductNumber LIKE @Product  
OPTION (OPTIMIZE FOR (@Product = 'BK-%') );  
GO  
-- Execute the stored procedure   
EXEC Production.uspProductUpdate 'BK-%';  

Capturar los resultados de la instrucción UPDATECapturing the Results of the UPDATE Statement

Ejemplos de esta sección muestran cómo usar el cláusula OUTPUT para devolver información de, o en función de las expresiones, cada fila afectada por una instrucción UPDATE.Examples in this section demonstrate how to use the OUTPUT Clause to return information from, or expressions based on, each row affected by an UPDATE statement. Estos resultados se pueden devolver a la aplicación de procesamiento para que los utilice en mensajes de confirmación, archivado y otros requisitos similares de una aplicación.These results can be returned to the processing application for use in such things as confirmation messages, archiving, and other such application requirements.

AA.AA. Usar UPDATE con la cláusula OUTPUTUsing UPDATE with the OUTPUT clause

En el siguiente ejemplo se actualiza en un 25 por ciento la columna VacationHours de las 10 primeras filas de la tabla Employee y también se establece el valor de la columna ModifiedDate en la fecha actual.The following example updates the column VacationHours in the Employee table by 25 percent for the first 10 rows and also sets the value in the column ModifiedDate to the current date. La cláusula OUTPUT devuelve el valor de VacationHours antes de aplicar la instrucción UPDATE en la columna deleted.VacationHours y el valor actualizado en la columna inserted.VacationHours en la variable de tabla @MyTableVar.The OUTPUT clause returns the value of VacationHours that exists before applying the UPDATE statement in the deleted.VacationHours column and the updated value in the inserted.VacationHours column to the @MyTableVar table variable.

Las dos instrucciones SELECT que le siguen devuelven los valores en @MyTableVar y los resultados de la operación de actualización en la tabla Employee.Two SELECT statements follow that return the values in @MyTableVar and the results of the update operation in the Employee table. Para obtener más ejemplos usa la cláusula OUTPUT, vea cláusula OUTPUT ( Transact-SQL ) .For more examples using the OUTPUT clause, see OUTPUT Clause (Transact-SQL).

USE AdventureWorks2012;  
GO  
DECLARE @MyTableVar table(  
    EmpID int NOT NULL,  
    OldVacationHours int,  
    NewVacationHours int,  
    ModifiedDate datetime);  
UPDATE TOP (10) HumanResources.Employee  
SET VacationHours = VacationHours * 1.25,  
    ModifiedDate = GETDATE()   
OUTPUT inserted.BusinessEntityID,  
       deleted.VacationHours,  
       inserted.VacationHours,  
       inserted.ModifiedDate  
INTO @MyTableVar;  
--Display the result set of the table variable.  
SELECT EmpID, OldVacationHours, NewVacationHours, ModifiedDate  
FROM @MyTableVar;  
GO  
--Display the result set of the table.  
SELECT TOP (10) BusinessEntityID, VacationHours, ModifiedDate  
FROM HumanResources.Employee;  
GO  

Usar UPDATE en otras instruccionesUsing UPDATE in other statements

En los ejemplos de esta sección se muestra cómo usar UPDATE en otras instrucciones.Examples in this section demonstrate how to use UPDATE in other statements.

AB.AB. Usar UPDATE en un procedimiento almacenadoUsing UPDATE in a stored procedure

En el ejemplo siguiente se usa una instrucción UPDATE en un procedimiento almacenado.The following example uses an UPDATE statement in a stored procedure. El procedimiento toma un parámetro de entrada @NewHours y un parámetro de salida @RowCount.The procedure takes one input parameter, @NewHours and one output parameter @RowCount. El @NewHours el valor del parámetro se utiliza en la instrucción UPDATE para actualizar la columna VacationHours en la tabla HumanResources.Employee.The @NewHours parameter value is used in the UPDATE statement to update the column VacationHours in the table HumanResources.Employee. El parámetro de salida @RowCount se usa para devolver el número de filas afectadas a una variable local.The @RowCount output parameter is used to return the number of rows affected to a local variable. La expresión CASE se utiliza en la cláusula SET para determinar el valor que está establecido para VacationHours condicionalmente.The CASE expression is used in the SET clause to conditionally determine the value that is set for VacationHours. Cuando se paga al empleado por hora (SalariedFlag = 0), VacationHours se establece en el número actual de horas más el valor especificado en @NewHours; de lo contrario, VacationHours se establece en el valor especificado en @NewHours.When the employee is paid hourly (SalariedFlag = 0), VacationHours is set to the current number of hours plus the value specified in @NewHours; otherwise, VacationHours is set to the value specified in @NewHours.

USE AdventureWorks2012;  
GO  
CREATE PROCEDURE HumanResources.Update_VacationHours  
@NewHours smallint  
AS   
SET NOCOUNT ON;  
UPDATE HumanResources.Employee  
SET VacationHours =   
    ( CASE  
         WHEN SalariedFlag = 0 THEN VacationHours + @NewHours  
         ELSE @NewHours  
       END  
    )  
WHERE CurrentFlag = 1;  
GO  

EXEC HumanResources.Update_VacationHours 40;  

AC.AC. Usar UPDATE en un bloque TRY…CATCHUsing UPDATE in a TRY…CATCH Block

En el ejemplo siguiente se usa una instrucción UPDATE en un bloque TRY... Bloque CATCH para controlar los errores de ejecución que podrían producirse durante la operación de actualización.The following example uses an UPDATE statement in a TRY…CATCH block to handle execution errors that may occur during the update operation.

USE AdventureWorks2012;  
GO  
BEGIN TRANSACTION;  

BEGIN TRY  
    -- Intentionally generate a constraint violation error.  
    UPDATE HumanResources.Department  
    SET Name = N'MyNewName'  
    WHERE DepartmentID BETWEEN 1 AND 2;  
END TRY  
BEGIN CATCH  
    SELECT   
         ERROR_NUMBER() AS ErrorNumber  
        ,ERROR_SEVERITY() AS ErrorSeverity  
        ,ERROR_STATE() AS ErrorState  
        ,ERROR_PROCEDURE() AS ErrorProcedure  
        ,ERROR_LINE() AS ErrorLine  
        ,ERROR_MESSAGE() AS ErrorMessage;  

    IF @@TRANCOUNT > 0  
        ROLLBACK TRANSACTION;  
END CATCH;  

IF @@TRANCOUNT > 0  
    COMMIT TRANSACTION;  
GO  

Ejemplos: Almacenamiento de datos SQLSQL Data Warehouse y Almacenamiento de datos paralelosParallel Data WarehouseExamples: Almacenamiento de datos SQLSQL Data Warehouse and Almacenamiento de datos paralelosParallel Data Warehouse

AD.AD. Usar una instrucción UPDATE simpleUsing a simple UPDATE statement

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.

Este ejemplo actualiza los valores de la EndDate y CurrentFlag columnas para todas las filas de la DimEmployee tabla.This example updates the values in the EndDate and CurrentFlag columns for all rows in the DimEmployee table.

-- Uses AdventureWorks  

UPDATE DimEmployee  
SET EndDate = '2010-12-31', CurrentFlag='False';  

También se pueden utilizar valores calculados en una instrucción UPDATE.You can also use computed values in an UPDATE statement. En el ejemplo siguiente se duplica el valor de la columna ListPrice para todas las filas de la tabla Product.The following example doubles the value in the ListPrice column for all rows in the Product table.

-- Uses AdventureWorks  

UPDATE DimEmployee  
SET BaseRate = BaseRate * 2;  

AE.AE. Uso de la instrucción UPDATE con una cláusula WHEREUsing the UPDATE statement with a 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.

-- Uses AdventureWorks  

UPDATE DimEmployee  
SET FirstName = 'Gail'  
WHERE EmployeeKey = 500;  

AF.AF. Mediante la instrucción UPDATE con etiquetaUsing the UPDATE statement with label

En el ejemplo siguiente se muestra el uso de una etiqueta para la instrucción UPDATE.The following example shows use of a LABEL for the UPDATE statement.

-- Uses AdventureWorks  

UPDATE DimProduct  
SET ProductSubcategoryKey = 2   
WHERE ProductKey = 313  
OPTION (LABEL = N'label1');  

AG.AG. Usar la instrucción UPDATE con información de otra tablaUsing the UPDATE statement with information from another table

Este ejemplo crea una tabla para almacenar el total de ventas por año.This example creates a table to store total sales by year. Actualiza las ventas totales para el año 2004 mediante la ejecución de una instrucción SELECT en la tabla FactInternetSales.It updates the total sales for the year 2004 by running a SELECT statement against the FactInternetSales table.

-- Uses AdventureWorks  

CREATE TABLE YearlyTotalSales (  
    YearlySalesAmount money NOT NULL,  
    Year smallint NOT NULL )  
WITH ( DISTRIBUTION = REPLICATE );  

INSERT INTO YearlyTotalSales VALUES (0, 2004);  
INSERT INTO YearlyTotalSales VALUES (0, 2005);  
INSERT INTO YearlyTotalSales VALUES (0, 2006);  

UPDATE YearlyTotalSales  
SET YearlySalesAmount=  
(SELECT SUM(SalesAmount) FROM FactInternetSales WHERE OrderDateKey >=20040000 AND OrderDateKey < 20050000)  
WHERE Year=2004;  

SELECT * FROM YearlyTotalSales;   

AH.AH. Reemplazo de combinación ANSI para instrucciones updateANSI join replacement for update statements

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:

CREATE TABLE [dbo].[AnnualCategorySales]
(   [EnglishProductCategoryName]    NVARCHAR(50)    NOT NULL
,   [CalendarYear]                  SMALLINT        NOT NULL
,   [TotalSalesAmount]              MONEY           NOT NULL
)
WITH
(
    DISTRIBUTION = ROUND_ROBIN
)
;  

La consulta original podría haber buscando algo parecido a esto:The original query might have looked something like this:

UPDATE  acs
SET     [TotalSalesAmount] = [fis].[TotalSalesAmount]
FROM    [dbo].[AnnualCategorySales]     AS acs
JOIN    (
        SELECT  [EnglishProductCategoryName]
        ,       [CalendarYear]
        ,       SUM([SalesAmount])              AS [TotalSalesAmount]
        FROM    [dbo].[FactInternetSales]       AS s
        JOIN    [dbo].[DimDate]                 AS d    ON s.[OrderDateKey]             = d.[DateKey]
        JOIN    [dbo].[DimProduct]              AS p    ON s.[ProductKey]               = p.[ProductKey]
        JOIN    [dbo].[DimProductSubCategory]   AS u    ON p.[ProductSubcategoryKey]    = u.[ProductSubcategoryKey]
        JOIN    [dbo].[DimProductCategory]      AS c    ON u.[ProductCategoryKey]       = c.[ProductCategoryKey]
        WHERE   [CalendarYear] = 2004
        GROUP BY
                [EnglishProductCategoryName]
        ,       [CalendarYear]
        ) AS fis
ON  [acs].[EnglishProductCategoryName]  = [fis].[EnglishProductCategoryName]
AND [acs].[CalendarYear]                = [fis].[CalendarYear]
;  

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:

-- Create an interim table
CREATE TABLE CTAS_acs
WITH (DISTRIBUTION = ROUND_ROBIN)
AS
SELECT  ISNULL(CAST([EnglishProductCategoryName] AS NVARCHAR(50)),0)    AS [EnglishProductCategoryName]
,       ISNULL(CAST([CalendarYear] AS SMALLINT),0)                      AS [CalendarYear]
,       ISNULL(CAST(SUM([SalesAmount]) AS MONEY),0)                     AS [TotalSalesAmount]
FROM    [dbo].[FactInternetSales]       AS s
JOIN    [dbo].[DimDate]                 AS d    ON s.[OrderDateKey]             = d.[DateKey]
JOIN    [dbo].[DimProduct]              AS p    ON s.[ProductKey]               = p.[ProductKey]
JOIN    [dbo].[DimProductSubCategory]   AS u    ON p.[ProductSubcategoryKey]    = u.[ProductSubcategoryKey]
JOIN    [dbo].[DimProductCategory]      AS c    ON u.[ProductCategoryKey]       = c.[ProductCategoryKey]
WHERE   [CalendarYear] = 2004
GROUP BY
        [EnglishProductCategoryName]
,       [CalendarYear]
;

-- Use an implicit join to perform the update
UPDATE  AnnualCategorySales
SET     AnnualCategorySales.TotalSalesAmount = CTAS_ACS.TotalSalesAmount
FROM    CTAS_acs
WHERE   CTAS_acs.[EnglishProductCategoryName] = AnnualCategorySales.[EnglishProductCategoryName]
AND     CTAS_acs.[CalendarYear]               = AnnualCategorySales.[CalendarYear]
;

--Drop the interim table
DROP TABLE CTAS_acs
;

Vea tambiénSee Also

CREATE TABLE (Transact-SQL) CREATE TABLE (Transact-SQL)
CREATE TRIGGER (Transact-SQL) CREATE TRIGGER (Transact-SQL)
Cursores (Transact-SQL) Cursors (Transact-SQL)
DELETE (Transact-SQL) DELETE (Transact-SQL)
INSERT (Transact-SQL) INSERT (Transact-SQL)
Texto y funciones de imagen ( Transact-SQL ) Text and Image Functions (Transact-SQL)
WITH common_table_expression (Transact-SQL) WITH common_table_expression (Transact-SQL)
FILESTREAM (SQL Server)FILESTREAM (SQL Server)