Está en la página 1de 20

1

UPDATE (Transact-SQL)
SQL Server 2014
Cambia los datos de una tabla o vista de SQL Server 2014. Para obtener ejemplos, vea Ejemplos.
Se aplica a: SQL Server (SQL Server 2008 a versin actual), Windows Azure SQL Database (Versin
inicial a versin actual).
Convenciones de sintaxis de Transact-SQL
Sintaxis
Transact-SQL
[ 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 .
2

]
table_or_view_name}
Argumentos
WITH <common_table_expression>
Especifica la vista o el conjunto de resultados temporal indicado, que tambin se conoce como expresin de tabla
comn (CTE), definido en el mbito de la instruccin UPDATE. El conjunto de resultados CTE se deriva de una
consulta simple. La instruccin UPDATE hace referencia al conjunto de resultados.
Las expresiones de tabla comunes tambin se pueden utilizar con las instrucciones SELECT, INSERT, DELETE y CREATE
VIEW. Para obtener ms informacin, vea WITH common_table_expression (Transact-SQL).
TOP ( expression) [ PERCENT ]
Especifica el nmero o porcentaje de filas que se va a actualizar. expression puede ser un nmero o un porcentaje de
las filas.
Las filas a las que se hace referencia en la expresin TOP utilizada con INSERT, UPDATE o DELETE no se ordenan.
En las instrucciones INSERT, UPDATE y DELETE, se deben utilizar parntesis para delimitar expression en TOP. Para
obtener ms informacin, vea TOP (Transact-SQL).
table_alias
Alias especificado en la clusula FROM que representa la tabla o vista de la que se van a actualizar las filas.
server_name
Es el nombre del servidor (un nombre de servidor vinculado o la funcin OPENDATASOURCE como nombre de
servidor) en el que se encuentra la tabla o la vista. Si se especifica server_name, son
obligatorios database_name y schema_name.
database_name
Es el nombre de la base de datos.
schema_name
Es el nombre del esquema al que pertenece la tabla o vista.
table_or view_name
Es el nombre de la tabla o vista cuyas filas se deben actualizar. La vista a la que hace
referencia table_or_view_name debe poder actualizarse y debe hacer referencia exactamente a una tabla base en la
clusula FROM de la vista. Para obtener ms informacin acerca de las vistas que se pueden actualizar, vea CREATE
VIEW (Transact-SQL).
rowset_function_limited
Es la funcin OPENQUERY u OPENROWSET, dependiendo de las funciones del proveedor.
WITH ( <Table_Hint_Limited> )
Especifica una o varias sugerencias de tabla que estn permitidas en una tabla de destino. La palabra clave WITH y
los parntesis son obligatorios. No se permiten NOLOCK ni READUNCOMMITTED. Para obtener ms informacin
acerca de las sugerencias de tabla, vea Sugerencias de tabla (Transact-SQL).
@table_variable
Especifica una variable table como origen de la tabla.
SET
Especifica la lista de nombres de variable o de columna que se van a actualizar.
column_name
Es una columna que contiene los datos que se van a cambiar. column_name debe existir en table_or view_name. Las
columnas de identidad no se pueden actualizar.
expression
Es una variable, un valor literal, una expresin o una instruccin de subseleccin entre parntesis que devuelve un
solo valor. El valor devuelto porexpression sustituye al valor existente en column_name o @variable.
Nota
Cuando se hace referencia a los tipos de datos de caracteres Unicode nchar, nvarchar y ntext, debe
3

agregarse como prefijo la letra mayscula 'N' a 'expression'. Si no se especifica 'N', SQL Server
convierte la cadena a la pgina de cdigos que se corresponde con la intercalacin predeterminada
de la base de datos o columna. Los caracteres que no se encuentren en esta pgina de cdigos se
perdern.
DEFAULT
Especifica que el valor predeterminado definido para la columna debe reemplazar al valor existente en esa
columna. Esta operacin tambin puede utilizarse para cambiar la columna a NULL si no tiene asignado ningn valor
predeterminado y se ha definido para aceptar valores NULL.
{ += | -= | *= | /= | %= | &= | ^= | |= }
Operador de asignacin compuesta:
+= Sumar y asignar
-= Restar y asignar
*= Multiplicar y asignar
/= Dividir y asignar
%= Mdulo y asignar
&= AND bit a bit y asignar
^= XOR bit a bit y asignar
|= OR bit a bit y asignar
udt_column_name
Es una columna de un tipo definido por el usuario.
property_name | field_name
Es un miembro de propiedad pblico o un miembro de datos pblico de un tipo definido por el usuario.
method_name ( argument [ ,... n] )
Es un mtodo mutador pblico no esttico de udt_column_name que utiliza uno o varios argumentos.
.WRITE (expression,@Offset,@Length)
Especifica que una seccin del valor de column_name se va a modificar. expression reemplaza las unidades @Length a
partir de @Offset decolumn_name. Con esta clusula solo se pueden especificar columnas de
tipo varchar(max), nvarchar(max) o varbinary(max). column_name no puede ser NULL y no se puede
calificar con un nombre de tabla o un alias de tabla.
expression: es el valor que se copia a column_name. expression se debe evaluar, o bien se debe poder convertir
implcitamente al tipo column_name. Siexpression se establece como NULL, se omitir @Length, y se truncar el valor
de column_name en el @Offset especificado.
@Offset es el punto inicial del valor de column_name en el que se escribe expression. @Offset es una posicin ordinal
basada en cero, es de tipo biginty no puede ser un nmero negativo. Si @Offset es NULL, la operacin de
actualizacin anexa expression al final del valor de column_name existente y@Length no se tiene en cuenta. Si
@Offset es mayor que la longitud del valor de column_name, el Motor de base de datos devuelve un error. Si la
suma de @Offset y @Length excede el final del valor subyacente de la columna, se elimina todo hasta el ltimo
carcter del valor. Si la suma de@Offset y LEN(expression) es superior al tamao subyacente declarado, se produce un
error.
@Length es la longitud de la seccin de la columna, a partir de @Offset, que se reemplaza
por expression. @Length es de tipo bigint y no puede ser un nmero negativo. Si @Length es NULL, la operacin de
actualizacin quita todos los datos de @Offset hasta el final del valor de column_name.
Para obtener ms informacin, vea la seccin Notas.
@ variable
Es una variable declarada que se establece en el valor devuelto por expression.
SET @variable = column = expression establece la variable en el mismo valor que la columna. Esto no es lo mismo
que SET @variable = column, column= expression, que establece la variable en el valor previo a la actualizacin de la
columna.
<OUTPUT_Clause>
4

Devuelve datos actualizados o expresiones basadas en ellos como parte de la operacin UPDATE. La clusula
OUTPUT no se admite en instrucciones DML dirigidas a tablas o vistas remotas. Para obtener ms informacin,
vea OUTPUT (clusula de Transact-SQL).
FROM <table_source>
Especifica que se utiliza un origen de tabla, vista o tabla derivada para proporcionar los criterios de la operacin de
actualizacin. Para obtener ms informacin, vea FROM (Transact-SQL).
Si el objeto que se actualiza es el que se indica en la clusula FROM y solo hay una referencia al objeto en ella, puede
especificarse o no un alias de objeto. Si el objeto que se actualiza aparece ms de una vez en la clusula FROM, una
nica referencia al objeto no debe especificar un alias de tabla.Todas las dems referencias al objeto de la clusula
FROM deben incluir un alias de objeto.
Una vista con un desencadenador INSTEAD OF UPDATE no puede ser el destino de UPDATE con una clusula FROM.
Nota
Las llamadas a OPENDATASOURCE, OPENQUERY u OPENROWSET en la clusula FROM se
evalan por separado y de forma independiente de otras llamadas a estas funciones utilizadas como
destino de la actualizacin, incluso si se han suministrado argumentos idnticos a las dos llamadas. En
particular, las condiciones de filtro o combinacin aplicadas en el resultado de una de esas llamadas no
tienen ningn efecto en los resultados de la otra llamada.
WHERE
Especifica las condiciones que limitan las filas que se actualizan. Hay dos modos de actualizacin, dependiendo del
formato de clusula WHERE que se utilice:
Las actualizaciones por bsqueda especifican una condicin de bsqueda para calificar las filas que se van a
eliminar.
Las actualizaciones posicionadas utilizan la clusula CURRENT OF para especificar un cursor. La operacin de
actualizacin se produce en la posicin actual del cursor.
<search_condition>
Especifica la condicin que debe cumplirse para que se actualicen las filas. La condicin de bsqueda tambin puede
ser la condicin en la que se basa una combinacin. El nmero de predicados que pueden incluirse en una condicin
de bsqueda no tiene lmite. Para obtener ms informacin acerca de los predicados y las condiciones de bsqueda,
vea Condiciones de bsqueda (Transact-SQL).
CURRENT OF
Indica que la actualizacin se realice en la posicin actual del cursor especificado.
Una actualizacin posicionada que utiliza una clusula WHERE CURRENT OF actualiza la fila que se encuentra en la
posicin actual del cursor. Este mtodo puede ser ms preciso que una actualizacin por bsqueda que utilice una
clusula WHERE <search_condition> para calificar las filas que se deben actualizar. Una actualizacin por bsqueda
modifica varias filas cuando la condicin de bsqueda no identifica una sola fila de forma exclusiva.
GLOBAL
Especifica que cursor_name hace referencia a un cursor global.
cursor_name
Es el nombre del cursor abierto desde el que se debe realizar la captura. Si hay un cursor global y otro local con el
nombre cursor_name, este argumento hace referencia al cursor global si se especifica GLOBAL; de lo contrario, hace
referencia al cursor local. El cursor debe permitir actualizaciones.
cursor_variable_name
Es el nombre de una variable de cursor. cursor_variable_name debe hacer referencia a un cursor que permita realizar
actualizaciones.
OPTION ( <query_hint> [ ,... n ] )
Especifica que se utilizan las sugerencias del optimizador para personalizar el modo en que el Motor de base de
datos procesa la instruccin. Para obtener ms informacin, vea Sugerencias de consulta (Transact-SQL).
Prcticas recomendadas
5

Utilice la funcin @@ROWCOUNT para devolver el nmero de filas insertado a la aplicacin cliente. Para obtener ms
informacin, vea @@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 instruccin UPDATE afecta a un nico registro. Si la instruccin UPDATE afecta a varios
registros, para devolver los valores nuevos y antiguos de cada registro utilice la clusula OUTPUT.
Acte con precaucin al especificar la clusula FROM para proporcionar los criterios de la operacin de actualizacin. Los
resultados de una instruccin UPDATE estn sin definir si la instruccin incluye una clusula FROM que no se especifica de
manera que solo haya un valor disponible para cada caso de columna que se actualice, es decir, si la instruccin UPDATE no
es determinista. Por ejemplo, en la instruccin UPDATE del siguiente script, las dos filas deTable1 cumplen los requisitos de
la clusula FROM de la instruccin UPDATE, pero no se define qu fila de Table1 se utiliza para actualizar la fila de 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 clusulas FROM y WHERE CURRENT OF. En el ejemplo siguiente,
las dos filas de Table2 cumplen los requisitos de la clusula FROM de la instruccin UPDATE. No se ha definido qu fila
de Table2 se utilizar para actualizar la fila de 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);
6

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
Compatibilidad
En una versin futura de SQL Server se quitar el uso de las sugerencias READUNCOMMITTED y NOLOCK en la clusula
FROM que se aplican a la tabla de destino de una instruccin UPDATE o DELETE. Evite usar estas sugerencias en este
contexto en el nuevo trabajo de desarrollo y planee modificar las aplicaciones que las usan actualmente.
Tipos de datos
Todas las columnas char y nchar se rellenan a la derecha hasta la longitud definida.
Si ANSI_PADDING se establece en OFF, se quitan todos los espacios finales de los datos insertados en las
columnas varchar y nvarchar, excepto en las cadenas que contienen solo espacios. Estas cadenas se truncan en una
cadena vaca. Si ANSI_PADDING se establece en ON, se insertan espacios al final. El controlador ODBC de Microsoft SQL
Server y el proveedor OLE DB para SQL Server establecen automticamente SET ANSI_PADDING en ON para cada
conexin. Se puede configurar en orgenes de datos ODBC o mediante atributos o propiedades de conexin. Para obtener
ms informacin, vea SET ANSI_PADDING (Transact-SQL).
Actualizar columnas de tipo text, ntext e image
Al modificar una columna text, ntext o image con UPDATE, se inicializa la columna, se le asigna un puntero de texto
vlido y se le asigna al menos una pgina de datos, a menos que la columna se actualice con NULL.
Para reemplazar o modificar bloques grandes de datos de tipo text, ntext o image, utilice WRITETEXT o UPDATETEXT en
lugar de la instruccin UPDATE.
Si la instruccin UPDATE pudo cambiar ms de una fila durante la actualizacin de la clave de agrupacin en clsteres y una
o varias columnas text, ntext oimage, la actualizacin parcial de estas columnas se ejecuta como una sustitucin
completa de los valores.
Importante
Los tipos de datos ntext, text e image se quitarn en una versin futura de Microsoft SQL Server. Evite su uso
en nuevos trabajos de desarrollo y piense en modificar las aplicaciones que los usan
actualmente. Use nvarchar(max), varchar(max) y varbinary(max) en su lugar.
Actualizar tipos de datos de valores grandes
Use la clusula .WRITE (expression, @Offset,@Length) para realizar una actualizacin parcial o completa de los tipos de
datos varchar(max), nvarchar(max) yvarbinary(max). Por ejemplo, la actualizacin parcial de una
columna varchar(max) podra eliminar o modificar solo los 200 primeros caracteres de la columna, mientras que una
actualizacin completa eliminara o modificara todos los datos de la columna. .WRITE que insertan o anexan datos nuevos se
registran mnimamente si se ha establecido para la base de datos el modelo de recuperacin optimizado para cargas masivas
de registros o el modelo de recuperacin simple. Tenga en cuenta que el registro mnimo no se utiliza cuando se actualizan
valores existentes. Para obtener ms informacin, vea El registro de transacciones (SQL Server).
7

El Motor de base de datos convierte una actualizacin parcial en actualizacin completa cuando la instruccin UPDATE
realiza una de estas acciones:
Cambia una columna de clave de la tabla o vista con particiones.
Modifica ms de una fila y tambin actualiza la clave de un ndice clster no nico en un valor no constante.
No se puede usar la clusula .WRITE para actualizar una columna NULL o establecer el valor de column_name como NULL.
@Offset y @Length se especifican en bytes para los tipos de datos varbinary y varchar, y en caracteres para el tipo de
datos nvarchar. Se calculan los desplazamientos correspondientes para las intercalaciones del juego de caracteres de
doble byte (DBCS).
Para que el rendimiento sea ptimo, se recomienda insertar o actualizar los datos en tamaos de fragmento que sean
mltiplos de 8.040 bytes.
Si se hace referencia en una clusula OUTPUT a la columna modificada por la clusula .WRITE, el valor completo de la
columna, ya sea la imagen anterior dedeleted.column_name o la imagen posterior de inserted.column_name , se vuelve a la
columna especificada en la variable de tabla. Vea el ejemplo G a continuacin.
Para obtener la misma funcionalidad de .WRITE con otros tipos de datos de carcter o binarios, utilice STUFF (Transact-SQL).
Actualizar columnas de tipos definidos por el usuario
Hay varios mtodos para actualizar los valores de columnas de tipos definidos por el usuario:
Suministrar un valor de un tipo de datos del sistema de SQL Server, siempre y cuando el tipo definido por el usuario
admita la conversin implcita o explcita desde ese tipo. En el ejemplo siguiente se muestra cmo actualizar un valor
de una columna de tipo Point, definido por el usuario, mediante la conversin explcita de una cadena.
UPDATE Cities
SET Location = CONVERT(Point, '12.3:46.2')
WHERE Name = 'Anchorage';
Invocar un mtodo, marcado como mutator, del tipo definido por el usuario, para realizar la actualizacin. En el
ejemplo siguiente se invoca un mtodo mutador de tipo Point denominado SetXY. Esto actualiza el estado de la
instancia del tipo.
UPDATE Cities
SET Location.SetXY(23.5, 23.5)
WHERE Name = 'Anchorage';
Nota
SQL Server devuelve un error si se invoca un mtodo mutador en un valor NULL de Transact-
SQL, o si un nuevo valor producido por un mtodo mutador es NULL.
Modificar el valor de un miembro de propiedad registrado o un miembro de datos pblico del tipo definido por el
usuario. La expresin que suministra el valor debe poder convertirse implcitamente al tipo de la propiedad. En el
ejemplo siguiente se modifica el valor de la propiedad X del tipo Point definido por el usuario.
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 mtodo mutador del tipo.
Actualizar datos FILESTREAM
Puede utilizar la instruccin UPDATE para actualizar un campo FILESTREAM de forma que tenga un valor nulo, un valor vaco
o una cantidad relativamente pequea de datos insertados. Sin embargo, se enva una gran cantidad de datos de manera
ms eficaz en un archivo si se utilizan interfaces de Win32. Al actualizar un campo FILESTREAM, modifica los datos BLOB
subyacentes en el sistema de archivos. Cuando un campo FILESTREAM est establecido en NULL, se eliminan los datos BLOB
asociados al campo. No puede utilizar .WRITE() para realizar actualizaciones parciales de datos FILESTREAM. Para obtener
ms informacin, vea FILESTREAM (SQL Server).
8

Tratamiento de errores
Si la actualizacin de una fila infringe una restriccin o una regla, infringe la configuracin de valores NULL de la columna o,
si el nuevo valor es de un tipo de datos incompatible, se cancela la instruccin, se devuelve un error y no se actualiza ningn
registro.
Cuando una instruccin UPDATE encuentra un error aritmtico (error de desbordamiento, divisin por cero o de dominio)
durante la evaluacin de la expresin, la actualizacin no se lleva a cabo. El resto del lote no se ejecuta y se devuelve un
mensaje de error.
Si la actualizacin de una o varias columnas que participan en un ndice clster hace que el tamao del mismo y de la fila
supere 8.060 bytes, la actualizacin no se produce y se devuelve un mensaje de error.
Interoperabilidad
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.
Cuando se define un desencadenador INSTEAD OF para las acciones UPDATE de una tabla, se ejecuta el desencadenador en
lugar de la instruccin UPDATE.En versiones anteriores de SQL Server solo se admite la definicin de desencadenadores
AFTER en instrucciones UPDATE y otras instrucciones de modificacin de datos. No se puede especificar la clusula FROM en
una instruccin UPDATE que haga referencia, directa o indirectamente, a una vista que tenga definido un desencadenador
INSTEAD OF. Para obtener ms informacin acerca de los desencadenadores INSTEAD OF, vea CREATE TRIGGER (Transact-
SQL).
Limitaciones y restricciones
No se puede especificar la clusula FROM en una instruccin UPDATE que haga referencia, directa o indirectamente, a una
vista que tenga definido un desencadenador INSTEAD OF. Para obtener ms informacin acerca de los desencadenadores
INSTEAD OF, vea CREATE TRIGGER (Transact-SQL).
Cuando una expresin de tabla comn (CTE) es el destino de una instruccin UPDATE, todas las referencias a la CTE de la
instruccin deben coincidir. Por ejemplo, si la CTE tiene asignado un alias en la clusula FROM, el alias se debe utilizar para
obtener todas las otras referencias a la CTE. Se requieren referencias CTE inequvocas porque una CTE no tiene un objeto ID,
que utiliza SQL Server para reconocer la relacin implcita entre un objeto y su alias. Sin esta relacin, el plan de consulta
puede producir un comportamiento de la unin inesperado y resultados imprevistos de la consulta. Los ejemplos siguientes
muestran mtodos correctos e incorrectos de especificar una CTE cuando la CTE es el objeto de destino de la operacin de
actualizacin.
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.
ID Value
------ -----
1 100
2 200
(2 row(s) affected)
9

-- 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.
ID Value
------ -----
1 100
2 100
(2 row(s) affected)
Comportamiento del bloqueo
Una instruccin UPDATE siempre adquiere un bloqueo exclusivo (X) en la tabla que modifica y retiene ese bloqueo hasta que
se completa la transaccin. Con un bloqueo exclusivo, ninguna otra transaccin puede modificar los datos. Puede especificar
sugerencias de tabla para invalidar este comportamiento predeterminado durante la ejecucin de la instruccin UPDATE
especificando otro mtodo 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. Para obtener ms informacin,
vea Sugerencias de tabla (Transact-SQL).
Comportamiento del registro
La instruccin UPDATE se registra; sin embargo, las actualizaciones parciales de tipos de datos de valores grandes mediante
la clusula .WRITE se registran mnimamente. Para obtener ms informacin, vea "Actualizar tipos de datos de valores
grandes" en la seccin anterior "Tipos de datos".
Seguridad
Permisos
Se requieren permisos UPDATE en la tabla de destino. Tambin se requieren permisos SELECT para la tabla que se actualiza si
la instruccin UPDATE contiene una clusula WHERE o en el caso de que el argumento expression de la clusula SET utilice
una columna de la tabla.
Los permisos para utilizar UPDATE corresponden de forma predeterminada a los miembros del rol fijo de servidor sysadmin,
de los roles fijos de base de datos db_owner y db_datawriter y al propietario de la tabla. Los miembros de los
roles sysadmin, db_owner y db_securityadmin, y el propietario de la tabla pueden transferir permisos a otros usuarios.
Ejemplos
Categora Elementos de sintaxis ofrecidos
Sintaxis bsica UPDATE
Limitar las filas que se actualizan WHERE TOP expresin de tabla comn WITH WHERE
CURRENT OF
10

Establecer valores de columna valores calculados operadores compuestos valores
predeterminados subconsultas
Especificar objetos de destino que no
sean tablas estndar
vistas variables de tabla alias de tabla
Actualizar los datos basados en datos
del resto de las tablas
FROM
Actualizar las filas de una tabla remota servidor vinculado OPENQUERY OPENDATASOURCE
Actualizar tipos de datos de objetos
grandes
.WRITE OPENROWSET
Actualizar tipos definidos por el
usuario
tipos definidos por el usuario
Invalidar el comportamiento
predeterminado del optimizador de
consultas mediante sugerencias
sugerencias de tabla sugerencias de consulta
Capturar los resultados de la
instruccin UPDATE
Clusula OUTPUT
Usar UPDATE en otras instrucciones Procedimientos almacenados TRYCATCH
Sintaxis bsica
Los ejemplos de esta seccin demuestran la funcionalidad bsica de la instruccin UPDATE con la sintaxis mnima requerida.
A.Usar una instruccin UPDATE simple
En el ejemplo siguiente se actualiza un solo valor de columna para todas las filas de la tabla Person.Address.
USE AdventureWorks2012;
GO
UPDATE Person.Address
SET ModifiedDate = GETDATE();
B.Actualizar varias columnas
En el siguiente ejemplo se actualizan los valores de las columnas Bonus, CommissionPct y SalesQuota para todas las filas
de la tabla SalesPerson.
USE AdventureWorks2012;
GO
UPDATE Sales.SalesPerson
SET Bonus = 6000, CommissionPct = .10, SalesQuota = NULL;
GO
Limitar las filas que se actualizan
En los ejemplos de esta seccin se muestran varias formas de limitar el nmero de filas afectadas por la instruccin UPDATE.
A.Usar la clusula WHERE
En el ejemplo siguiente se utiliza la clusula WHERE para especificar las filas que se van a actualizar. La instruccin 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.
USE AdventureWorks2012;
11

GO
UPDATE Production.Product
SET Color = N'Metallic Red'
WHERE Name LIKE N'Road-250%' AND Color = N'Red';
GO
B.Usar la clusula TOP
En los siguientes ejemplos use la clusula TOP para limitar el nmero de filas que se modifican en una instruccin
UPDATE. Cuando se usa una clusula TOP (n) con UPDATE, la operacin de actualizacin se realiza en una seleccin aleatoria
de un nmero de filas 'n'. En el ejemplo siguiente se actualiza un 25 por ciento la columna VacationHours en 10 filas
aleatorias de la tabla Employee.
USE AdventureWorks2012;
GO
UPDATE Production.Product
SET Color = N'Metallic Red'
WHERE Name LIKE N'Road-250%' AND Color = N'Red';
GO
Si debe usar TOP para aplicar actualizaciones por orden cronolgico, debe utilizarla junto con ORDER BY en una instruccin
de subseleccin. En el siguiente ejemplo se actualizan las horas de vacaciones de los 10 empleados cuyas fechas de alta son
ms antiguas.
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
C.Usar la clusula WITH common_table_expression
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. La expresin de tabla comn devuelve una lista
jerrquica de partes que se utilizan directamente para generar elProductAssemblyID 800 y las partes que se utilizan para
generar esos componentes, etc. Solo se modifican las filas devueltas por la expresin de tabla comn.
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;
12

D.Usar la clusula WHERE CURRENT OF
En el siguiente ejemplo se usa la clusula WHERE CURRENT OF para actualizar solo la fila en la que se coloca el
cursor. Cuando un cursor se basa en una combinacin, solo se modifica el table_name especificado en la instruccin
UPDATE. Las dems tablas que participan en el cursor no se ven afectadas.
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 columna
En los ejemplos de esta seccin se muestra la actualizacin de columnas mediante valores calculados, subconsultas y valores
DEFAULT.
A.Especificar un valor calculado
En los siguientes ejemplos se usan valores calculados en una instruccin UPDATE. En el ejemplo se duplica el valor de la
columna ListPrice para todas las filas de la tabla Product.
USE AdventureWorks2012 ;
GO
UPDATE Production.Product
SET ListPrice = ListPrice * 2;
GO
B.Especificar un operador compuesto
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 sumndole 10.
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.
USE AdventureWorks2012;
GO
UPDATE Production.ScrapReason
SET Name += ' - tool malfunction'
WHERE ScrapReasonID BETWEEN 10 and 12;
C.Especificar una subconsulta en la clusula SET
13

En el siguiente ejemplo se usa una subconsulta en la clusula SET para determinar el valor usado para actualizar la
columna. La subconsulta debe devolver solo un valor escalar. Es decir, un solo valor por fila. En el ejemplo se modifica la
columna SalesYTD de la tabla SalesPerson para reflejar las ventas ms recientes registradas en la
tabla SalesOrderHeader. La subconsulta suma las ventas de cada vendedor en la instruccin UPDATE.
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
D.Actualizar las filas con valores DEFAULT
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 que20.00.
USE AdventureWorks2012;
GO
UPDATE Production.Location
SET CostRate = DEFAULT
WHERE CostRate > 20.00;
Especificar objetos de destino que no sean tablas estndar
En los ejemplos de esta seccin se muestra cmo actualizar filas especificando una vista, un alias de tabla o una variable de
tabla.
A.Especificar una vista como el objeto de destino
En el siguiente ejemplo se actualizan las filas de la tabla especificando una vista como el objeto de destino. La definicin de
la vista hace referencia a varias tablas, sin embargo, la instruccin UPDATE se ejecuta correctamente porque hace referencia a
columnas de una sola de las tablas subyacentes. Se producira un error en la instruccin UPDATE si se especificaran columnas
de ambas tablas. Para obtener ms informacin, vea Modificar datos mediante una vista.
USE AdventureWorks2012;
GO
UPDATE Person.vStateProvinceCountryRegion
SET CountryRegionName = 'United States of America'
WHERE CountryRegionName = 'United States';
B.Especificar un alias de tabla como el objeto de destino
En el siguiente ejemplo se actualizan las filas de la tabla Production.ScrapReason. El alias de tabla asignado
a ScrapReason de la clusula FROM se especifica como el objeto de destino de la clusula UPDATE.
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;
C.Especificar una variable de tabla como el objeto de destino
En el siguiente ejemplo se actualizan las filas de una variable de tabla.
14

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 del resto de las tablas
En los ejemplos de esta seccin se muestran mtodos para actualizar las filas de una tabla basada en la informacin de otra.
A.Usar la instruccin UPDATE con informacin de otra tabla
En este ejemplo se modifica la columna SalesYTD de la tabla SalesPerson para reflejar las ventas ms recientes registradas
en la tabla SalesOrderHeader.
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. Si se puede registrar ms de una venta para un vendedor determinado el mismo da, el
ejemplo que se muestra no funcionar correctamente. Se ejecuta sin errores, pero cada valor de SalesYTD se actualiza con
una sola venta, independientemente del nmero de ventas que se produjeron ese da realmente. Esto es debido a que una
sola instruccin UPDATE nunca actualiza la misma fila dos veces.
Si puede haber ms de una venta el mismo da para un vendedor especificado, todas las ventas de cada vendedor se deben
agregar en la instruccinUPDATE, tal como se muestra en el siguiente ejemplo:
USE AdventureWorks2012;
GO
UPDATE Sales.SalesPerson
SET SalesYTD = SalesYTD +
(SELECT SUM(so.SubTotal)
FROM Sales.SalesOrderHeader AS so
15

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 remota
En los ejemplos de esta seccin se muestra cmo actualizar las filas de una tabla de destino remota mediante un servidor
vinculado o una funcin de conjunto de filas para hacer referencia a la tabla remota.
A.Actualizar datos en una tabla remota con un servidor vinculado
En el ejemplo siguiente se actualiza una tabla en un servidor remoto. En el ejemplo se comienza creando un vnculo al origen
de datos remoto mediantesp_addlinkedserver. El nombre del servidor vinculado, MyLinkServer, se especifica despus como
parte del nombre de objeto de cuatro partes con el formato servidor.catlogo.esquema.objeto. Observe que debe especificar
un nombre de servidor vlido para @datasrc.
USE master;
GO
-- Create a link to the remote data source.
-- Specify a valid server name for @datasrc as 'server_name' or 'server_name\instance_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;
B.Actualizar datos en una tabla remota con la funcin OPENQUERY
En el ejemplo siguiente se actualiza una fila en una tabla remota especificando la funcin de conjunto de
filas OPENQUERY. En este ejemplo se usa el nombre del servidor vinculado creado en el ejemplo anterior.
UPDATE OPENQUERY (MyLinkServer, 'SELECT GroupName FROM HumanResources.Department WHERE
DepartmentID = 4')
SET GroupName = 'Sales and Marketing';
C.Actualizar datos en una tabla remota con la funcin OPENDATASOURCE
En el ejemplo siguiente se inserta una fila en una tabla remota especificando la funcin de conjunto de
filas OPENDATASOURCE. Especifique un nombre de servidor vlido para el origen de datos con el
formato server_name o server_name\instance_name. Quiz deba configurar la instancia de SQL Server para las consultas
distribuidas ad hoc. Para obtener ms informacin, vea ad hoc distributed queries (opcin de configuracin del servidor).
UPDATE OPENQUERY (MyLinkServer, 'SELECT GroupName FROM HumanResources.Department WHERE
DepartmentID = 4')
SET GroupName = 'Sales and Marketing';
Actualizar tipos de datos de objetos grandes
En los ejemplos de esta seccin se muestran los mtodos de actualizacin de los valores de columnas definidos con tipos de
datos de objetos grandes (LOB).
16

A.Usar UPDATE con .WRITE para modificar los datos de una columna de tipo nvarchar(max)
En el ejemplo siguiente se utiliza la clusula .WRITE para actualizar un valor parcial de DocumentSummary, una columna de
tipo nvarchar(max) de la tablaProduction.Document . La palabra components se sustituye por la
palabra features especificando la palabra sustituta, la ubicacin inicial (desplazamiento) de la palabra que se va a sustituir
en los datos existentes y el nmero de caracteres que se va a sustituir (longitud). En el ejemplo tambin se usa la clusula
OUTPUT para devolver las imgenes anterior y posterior de la columna DocumentSummary a la variable de
tabla @MyTableVar.
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
B.Usar UPDATE con .WRITE para agregar y quitar datos en una columna de tipo nvarchar(max)
En los ejemplos siguientes se agregan y quitan datos en una columna de tipo nvarchar(max) que tiene un valor
establecido actualmente en NULL. Dado que no se puede utilizar la clusula .WRITE para modificar una columna NULL,
primero se llena la columna con datos temporales. Despus, estos datos se reemplazan por los datos correctos mediante la
clusula .WRITE. En los dems 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. Las instrucciones SELECT muestran la modificacin de
datos resultante de cada instruccin UPDATE.
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
17

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
C.Usar UPDATE con OPENROWSET para modificar una columna de tipo varbinary(max)
En el ejemplo siguiente se sustituye por una imagen nueva una imagen almacenada en una columna de
tipo varbinary(max). La funcin OPENROWSET se usa con la opcin BULK para cargar la imagen en la columna. En este
ejemplo se da por supuesto que hay un archivo denominado Tires.jpg en la ruta de acceso especificada.
USE AdventureWorks2012;
GO
UPDATE Production.ProductPhoto
SET ThumbNailPhoto = (
SELECT *
FROM OPENROWSET(BULK 'c:\Tires.jpg', SINGLE_BLOB) AS x )
WHERE ProductPhotoID = 1;
GO
D.Usar UPDATE para modificar datos FILESTREAM
En el siguiente ejemplo se usa la instruccin UPDATE para modificar los datos del archivo del sistema de archivos. No se
recomienda este mtodo para transmitir grandes cantidades de datos a un archivo. Use las interfaces de Win32
adecuadas. En el ejemplo siguiente se reemplaza cualquier texto del registro del archivo por el texto Xray 1. Para obtener
ms informacin, vea FILESTREAM (SQL Server).
UPDATE Archive.dbo.Records
SET [Chart] = CAST('Xray 1' as varbinary(max))
WHERE [SerialNumber] = 2;
Actualizar tipos definidos por el usuario
En los siguientes ejemplos se modifican valores de columnas de tipo definido por el usuario (UDT) CLR. Se muestran tres
mtodos. Para obtener ms informacin acerca de las columnas definidas por el usuario, vea Tipos definidos por el usuario
de CLR.
18

A.Usar un tipo de datos del sistema
Puede actualizar un UDT suministrando un valor en un tipo de datos del sistema de SQL Server, siempre que el tipo definido
por el usuario admita la conversin implcita o explcita desde ese tipo. En el ejemplo siguiente se muestra cmo actualizar
un valor de una columna de tipo Point, definido por el usuario, mediante la conversin explcita de una cadena.
UPDATE dbo.Cities
SET Location = CONVERT(Point, '12.3:46.2')
WHERE Name = 'Anchorage';
B.Invocar un mtodo
Puede actualizar un UDT invocando un mtodo, marcado como mutador, del tipo definido por el usuario, para realizar la
actualizacin. En el ejemplo siguiente se invoca un mtodo mutador de tipo Point denominado SetXY. Esto actualiza el
estado de la instancia del tipo.
UPDATE dbo.Cities
SET Location.SetXY(23.5, 23.5)
WHERE Name = 'Anchorage';
C.Modificar el valor de una propiedad o miembro de datos
Puede actualizar un UDT modificando el valor de un miembro de datos pblico o de un miembro de propiedad registrado
del tipo definido por el usuario.La expresin que suministra el valor debe poder convertirse implcitamente al tipo de la
propiedad. En el ejemplo siguiente se modifica el valor de la propiedad X del tipo Point definido por el usuario.
UPDATE dbo.Cities
SET Location.X = 23.5
WHERE Name = 'Anchorage';
Invalidar el comportamiento predeterminado del optimizador de consultas mediante sugerencias
En los ejemplos de esta seccin se muestra cmo usar sugerencias de tabla y de consulta para invalidar de forma temporal el
comportamiento predeterminado del optimizador de consultas cuando se procesa la instruccin UPDATE.
Advertencia
Como el optimizador de consultas de SQL Server suele seleccionar el mejor plan de ejecucin de una
consulta, se recomienda que nicamente los administradores de bases de datos y los desarrolladores
experimentados utilicen las sugerencias y como ltimo recurso.
A.Especificar una sugerencia de tabla
En el siguiente ejemplo se especifica la sugerencia de tabla TABLOCK. Esta sugerencia especifica que se aplique un bloqueo
compartido a la tablaProduction.Product y que se mantenga hasta que finalice la instruccin UPDATE.
USE AdventureWorks2012;
GO
UPDATE Production.Product
WITH (TABLOCK)
SET ListPrice = ListPrice * 1.10
WHERE ProductNumber LIKE 'BK-%';
GO
B.Especificar una sugerencia de consulta
En el siguiente ejemplo se especifica la sugerencia de consultaOPTIMIZE FOR (@variable) en la instruccin UPDATE. Esta
sugerencia indica al optimizador de consultas que use un valor concreto para una variable local cuando la consulta se
compile y optimice. El valor se utiliza solo durante la optimizacin de la consulta y no durante la ejecucin de la misma.
USE AdventureWorks2012;
GO
CREATE PROCEDURE Production.uspProductUpdate
@Product nvarchar(25)
AS
19

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 instruccin UPDATE
Los ejemplos de esta seccin demuestran cmo usar la clusula OUTPUT para devolver informacin de cada fila afectada por
una instruccin UPDATE o de expresiones que se basan en esta instruccin. Estos resultados se pueden devolver a la
aplicacin de procesamiento para que los utilice en mensajes de confirmacin, archivado y otros requisitos similares de una
aplicacin.
A.Usar UPDATE con la clusula OUTPUT
En el siguiente ejemplo se actualiza en un 25 por ciento la columna VacationHours de las 10 primeras filas de la
tabla Employee y tambin se establece el valor de la columna ModifiedDate en la fecha actual. La clusula OUTPUT devuelve
el valor de VacationHours antes de aplicar la instruccin UPDATE en la columna deleted.VacationHours y el valor
actualizado en la columna inserted.VacationHours en la variable de tabla @MyTableVar.
Las dos instrucciones SELECT que le siguen devuelven los valores en @MyTableVar y los resultados de la operacin de
actualizacin en la tabla Employee.Para obtener ms ejemplos en los que se utiliza la clusula OUTPUT, vea OUTPUT
(clusula de 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 instrucciones
En los ejemplos de esta seccin se muestra cmo usar UPDATE en otras instrucciones.
A.Usar UPDATE en un procedimiento almacenado
En el siguiente ejemplo se utiliza una instruccin UPDATE en un procedimiento almacenado. El procedimiento toma un
parmetro de entrada @NewHours y un parmetro de salida @RowCount. El valor del parmetro @NewHours se utiliza en la
instruccin UPDATE para actualizar la columna VacationHours de la tablaHumanResources.Employee. El parmetro de
salida @RowCount se usa para devolver el nmero de filas afectadas a una variable local. La expresin CASE se utiliza en la
clusula SET para determinar el valor que est establecido para VacationHours condicionalmente. Cuando se paga al
20

empleado por hora (SalariedFlag = 0), VacationHours se establece en el nmero actual de horas ms el valor
especificado en @NewHours; de lo contrario, VacationHours se establece en el valor especificado en @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;
B.Usar UPDATE en un bloque TRYCATCH
En el siguiente ejemplo se usa una instruccin UPDATE en un bloque TRYCATCH para administrar los errores de ejecucin
que se puedan producir durante una operacin de actualizacin.
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