You are on page 1of 99

Clusula SELECT (SQL Server Compact)

Otras versiones Personas que lo han encontrado til: 0 de 1 - Valorar este tema Especifica las columnas que debe devolver la consulta.

Sintaxis
SELECT [ ALL | DISTINCT ] TOP (expression) < select_list > < select_list > ::= { * | { table_name | table_alias }.* | { column_name | expression } [ [ AS ] column_alias ] } [ ,...n ]

Argumentos
ALL Especifica que el conjunto de resultados puede incluir filas duplicadas. ALL es el valor predeterminado. DISTINCT Especifica que el conjunto de resultados slo puede incluir filas nicas. Los valores NULL se consideran iguales desde el punto de vista de la palabra clave DISTINCT. TOP (expresin) Indica que se devolver slo un primer conjunto especificado o porcentaje de filas del conjunto de resultados de la consulta. expression puede ser un nmero o un porcentaje de filas. Puede utilizar la clusula TOP en instrucciones SELECT, INSERT, UPDATE y DELETE. Se requieren parntesis para delimitar la expresin de TOP en las instrucciones INSERT, UPDATE y DELETE. Para compatibilidad con versiones anteriores, se admite el uso de la expresin TOP sin parntesis en instrucciones SELECT, pero no lo recomendamos. Para obtener ms informacin, vea TOP (SQL Server Compact). < select_list > Columnas que se deben seleccionar para el conjunto de resultados. La lista de seleccin es una serie de expresiones separadas por comas. *

Especifica que se deben devolver todas las columnas de todas las tablas de la clusula FROM. Las columnas se devuelven por tabla, segn se especifique en la clusula FROM, y en el orden en el que aparecen en ella. table_name| table_alias.* Limita el mbito de * a la tabla especificada. Requiere que se devuelvan todas las columnas de la tabla especificada en la clusula FROM. Las columnas se devuelven en el orden en que aparecen en la tabla. Si una tabla tiene un alias especificado en la clusula FROM, se debe utilizar dicho alias. No se puede usar el nombre de la tabla. column_name Nombre de una columna que se debe devolver. Para impedir que la referencia sea ambigua, como en el caso de que dos de las tablas de la clusula FROM tengan columnas con nombres duplicados, se debe calificar column_name. Por ejemplo, si las tablas 'A' y 'B' de una base de datos contienen una columna denominada 'IdElemento' y ambas tablas se combinan en una consulta, IdElemento se debe especificar en la lista SELECT como 'A.IdElemento' y 'B.IdElemento'. Si se ha incluido un alias de tabla, dicho alias se debe usar para calificar el nombre de la columna. En caso contrario, se debe usar el nombre completo de la tabla. expression Nombre de columna, constante, funcin o cualquier combinacin vlida de nombres de columna, constantes y funciones conectados mediante uno o varios operadores. column_alias Nombre alternativo para sustituir el nombre de la columna en el conjunto de resultados de la consulta. Por ejemplo, se puede especificar un alias como "Cantidad", "Cantidad hasta hoy" o "Cant" para una columna denominada "cantidad". Los alias se emplean tambin para especificar nombres para los resultados de expresiones; por ejemplo: SELECT AVG([Unit Price]) AS [Average Price] FROM [Order Details]

Nota

column_alias se puede utilizar en una clusula ORDER BY, pero no en una clusula WHERE, GROU

Leccin 18 - INSERT, UPDATE, DELETE SQL


En esta leccin vamos a ver como modificar la BD. Los registros de una tabla pueden ser modificados de tres modos: Crear nuevos registros, modificarlos o bien eliminarlos. No se va a profundizar en este sentido, esto lo dejaremos para un posible curso avanzado de SQL. Por razones obvias no podr usar el banco de pruebas para probar estas instrucciones, de modo que para ello deber usar su propia BD. Insert SQL La instruccin INSERT permite crear o insertar nuevos registros en una tabla, veamos su sintaxis con un ejemplo prctico, la insercin de un registro en la tabla ALUMNOS:

CDIGO: SELECCIONAR TODO

insert into ALUMNOS (ID_ALUMNO , NOMBRE , APELLIDOS , F_NACIMIENTO) values (1 , 'Pablo' , 'Hernandaz Mata' , '1995-03-14')

Observe como todo lo que se explic en referencia a los tipos de datos es valido para la instruccin INSERT. Los datos de tipo numrico no se entrecomillan, a diferencia de los datos de tipo cadena y fecha.

En general la sintaxis de la instruccin INSERT es la siguiente:


CDIGO: SELECCIONAR TODO

INSERT INTO nombre_tabla (lista de campos separados por comas)

VALUES (lista de datos separados por comas)

Donde cada dato de la lista VALUES se corresponde y se asigna a cada campo de la tabla en el mismo orden de aparicin de la sentencia INSERT. Cabe mencionar que si la clave primaria que identifica el registro que se pretende insertar ya la usa un registro existente el SGBD rechazara la operacin y devolvera un error de clave primaria duplicada. As que cuando usted rellena un formulario en Internet por ejemplo, y los datos son almacenados en una BD, en algn momento del proceso se realizar una instruccin INSERT con los datos que usted a cumplimentado. ***

Update SQL La instruccin UPDATE permite actualizar registros de una tabla. Debemos por lo tanto indicar que registros se quiere actualizar mediante la clusula WHERE, y que campos mediante la clusula SET, adems se deber indicar que nuevo dato va a guardar cada campo. As por ejemplo supongamos que para el curso que careca de profesor finalmente ya se ha decidido quien lo va a impartir, la sintaxis que permite actualizar el profesor que va a impartir un curso sera la siguiente:

CDIGO: SELECCIONAR TODO

update CURSOS set ID_PROFE = 2 where ID_CURSO = 5

Todo lo expuesto sobre lgica booleana es valido para la clausula WHERE de la instruccin UPDATE, en todo caso dicha clusula se comporta igual que en una consulta, solo que ahora en lugar de seleccionar registros para mostrarnos algunos o todos los campos, seleccionar registros para modificar algunos o todos sus campos. Por lo tanto omitir la clusula WHERE en una instruccin UPDATE implica aplicar la actualizacin a todos los registros de la tabla.

La instruccin anterior asignar un 2 en el campo ID_PROFE de la tabla CURSOS en los registros cuyo valor en el campo ID_CURSO sea 5. Como sabemos que el campo ID_CURSO es la clave primaria de la tabla, tan solo se modificar un solo registro si es que existe. Obviamente en este caso, dado que el campo que se pretende actualizar es clave fornea de la tabla PROFESORES, si no existe un registro en dicha tabla con identificador 2 el SGBD devolver un error de clave no encontrada. Veamos otro ejemplo, esta vez se modificarn varios campos y registros con una sola instruccin. Recordemos la tabla EMPLEADOS, en ella se guardan los datos de cada empleado, el sueldo y supongamos que tambin se guarda en el campo PRECIO_HORA el precio de la hora extra que cobra cada empleado en el caso que las trabaje. Bien, con el cambio de ejercicio se deben subir los sueldos y el precio por hora extra trabajada, digamos que un 2% el sueldo y un 1 % el precio de la hora extra. Sin embargo la poltica de empresa congela el salario a directivos que cobran 3000 euros o ms. Qu instruccin actualizara estos importes segn estas premisas? :
CDIGO: SELECCIONAR TODO

update EMPLEADOS set SALARIO = SALARIO * 1.02 PRECIO_HORA = PRECIO_HORA * 1.01 where SALARIO < 3000

Por lo tanto solo se est actualizando el salario y el precio de la hora extra de aquellos empleados que su salario es inferior a 3000 euros. En general la sintaxis de la instruccin UPDATE es la siguiente:
CDIGO: SELECCIONAR TODO

UPDATE nombre_tabla SET campo1 = valor1, campo2 = valor2, ...

campoN = valorM WHERE condicines

***

Delete SQL La isntruccin DELETE permite eliminar regsitros de una tabla, su sintaxis es simple, puesto que solo debemos indicar que registros deseamos eliminar mediante la clusula WHERE. La siguiente consulta elimina todos los registros de la tabla mascotas que estan de baja:

CDIGO: SELECCIONAR TODO

delete from MACOTAS where ESTADO = 'B'

Al igua que la instruccin que ocurria con la UPDATE, para la instruccin DELETE es vlido todo lo expuesto sobe la clusula WHERE para consultas.

La siguiente instruccin elimina todos los registros de la tabla VEHICULOS:

CDIGO: SELECCIONAR TODO

delete from VEHICULOS

Al eliminar registros de una tabla estos no deben figurar como clave fornea en otra tabla, de lo contrario el SGBD devolver un error de violacin de integridad referencial, puesto que si se permitiese quedaran regsitros huerfanos.

En general la sintaxis de la instruccin DELETE es la siguiente:


CDIGO: SELECCIONAR TODO

DELETE FROM nombre_tabla WHERE condiniones

*** Resumen Con las instrucciones INSERT, DELETE y UPDATE el SGBD permite crear eliminar o modificar registros. La clusula WHERE de las instrucciones DELETE y UPDATE se comporta igual que en las consultas y permite descartar o considerar registros mediante condiciones por la instruccin de actualizacin o de borrado. Omitir la clusula WHERE implica aplicar la operacin a todos los registros de la tabla. Al insertar eliminar o actualizar datos, deben respetarse las restricciones. Si estas estn montadas en la BD, cosa por otro lado muy recomendable, podemos tener errores de tres tipos: Clave primaria duplicada (Al insertar o modificar un registro). Violacin de integridad referencial (se pretende dejar hurfanos registros que apuntan al registro padre al intentarlo eliminar o modificar). Clave padre no encontrada (al actualizar o insertar una clave fornea que no existe en la tabla padre a la que apunta)

DELETE (Transact-SQL)
SQL Server 2012 Otras versiones

Personas que lo han encontrado til: 1 de 1 - Valorar este tema Quita una o varias filas de una tabla o vista de SQL Server 2012. Convenciones de sintaxis de Transact-SQL

Sintaxis
Transact-SQL [ WITH <common_table_expression> [ ,...n ] ] DELETE [ TOP ( expression ) [ PERCENT ] ] [ FROM ] { { table_alias | <object> | rowset_function_limited [ WITH ( table_hint_limited [ ...n ] ) ] } | @table_variable } [ <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 }

Argumentos
WITH <common_table_expression> Especifica el conjunto de resultados de nombre temporal, tambin conocido como expresin de tabla comn, definido dentro del mbito de la instruccin DELETE. El conjunto de resultados se deriva de una instruccin SELECT. Las expresiones de tabla comunes tambin se pueden utilizar con las instrucciones SELECT, INSERT, UPDATE y CREATE VIEW. Para obtener ms informacin, vea WITH Common. TOP (expression) [ PERCENT ] Especifica el nmero o el porcentaje de filas aleatorias que se van a eliminar. 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. Para obtener ms informacin, vea TOP (Transact-SQL). FROM Palabra clave opcional que se puede usar entre la palabra clave DELETE y el destino table_or_view_name o rowset_function_limited. table_alias Alias especificado en la clusula FROM table_source que representa la tabla o vista de la que se van a eliminar las filas. server_name 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 El nombre de la base de datos. schema_name Nombre del esquema al que pertenece la tabla o la vista. table_or view_name Nombre de la tabla o vista cuyas filas se van a quitar. En este mbito, se puede utilizar una variable de tabla como origen de tabla de una instruccin DELETE. La vista a la que hace referencia table_or_view_name debe poderse actualizar y debe hacer referencia exactamente a una tabla base de la clusula FROM de la definicin de vista. Para obtener ms informacin acerca de las vistas que se pueden actualizar, vea CREATE VIEW (Transact-SQL). rowset_function_limited

Funcin OPENQUERY u OPENROWSET, dependiendo del proveedor. WITH ( <table_hint_limited> [... n] ) 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). <OUTPUT_Clause> Devuelve filas eliminadas, o expresiones basadas en ellas, como parte de la operacin DELETE. 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 una clusula FROM adicional. Esta extensin de Transact-SQL para DELETE permite especificar datos de <table_source> y eliminar las filas correspondientes de la tabla en la primera clusula FROM. Se puede utilizar esta extensin, que especifica una combinacin, en lugar de una subconsulta en la clusula WHERE para identificar las filas que se van a quitar. Para obtener ms informacin, vea FROM (Transact-SQL). WHERE Especifica las condiciones utilizadas para limitar el nmero de filas que se van a eliminar. Si no se proporciona una clusula WHERE, DELETE quita todas las filas de la tabla. Hay dos formas de operaciones de eliminacin, que se basan en las condiciones que se especifiquen en la clusula WHERE: Las eliminaciones por bsqueda especifican una condicin de bsqueda que califica las filas que se van a eliminar. Por ejemplo, WHERE column_name= value. Las eliminaciones por posicin utilizan la clusula CURRENT OF para especificar un cursor. La operacin de eliminacin se produce en la posicin actual del cursor. Este mtodo puede ser ms preciso que una instruccin DELETE por bsqueda que utilice una clusula WHERE search_condition para calificar las filas que se van a eliminar. Una instruccin DELETE por bsqueda elimina varias filas si la condicin de bsqueda no identifica exclusivamente una nica fila. <search_condition> Especifica las condiciones restrictivas de las filas que se van a eliminar. No hay lmite en el nmero de predicados que se pueden incluir en una condicin de bsqueda. Para obtener ms informacin, vea Condiciones de bsqueda (Transact-SQL). CURRENT OF Especifica que la instruccin DELETE se ejecutar en la posicin actual del cursor especificado. GLOBAL Especifica que cursor_name hace referencia a un cursor global. cursor_name Es el nombre del cursor abierto desde el que se realiza 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 Nombre de una variable de cursor. La variable de cursor debe hacer referencia a un cursor que permita realizar actualizaciones. OPTION ( <query_hint> [ ,... n] ) Palabras clave que indican que se utilizan sugerencias del optimizador para personalizar el procesamiento de la instruccin por parte del Motor de base de datos. Para obtener ms informacin, vea Sugerencias de consulta (Transact-SQL).

Prcticas recomendadas
Para eliminar todas las filas de una tabla, use TRUNCATE TABLE. TRUNCATE TABLE es ms rpido que DELETE y utiliza menos recursos de los registros de transacciones y de sistema. Use la funcin @@ROWCOUNT para devolver el nmero de filas eliminadas a la aplicacin cliente. Para obtener ms informacin, vea @@ROWCOUNT (Transact-SQL).

Tratamiento de errores
Puede implementar el control de errores de la instruccin DELETE especificando la instruccin en una construccin TRYCATCH. La instruccin DELETE puede tener un error si infringe un desencadenador o intenta quitar una fila a la que hacen referencia datos de otra tabla con una restriccin FOREIGN KEY. Si la instruccin DELETE quita varias filas y cualquiera de las filas eliminadas infringe un desencadenador o restriccin, se cancela la instruccin, se devuelve un error y no se elimina ninguna fila. Cuando una instruccin DELETE encuentra un error aritmtico (desbordamiento, divisin entre cero o error de dominio) al evaluar una expresin, el Motor de base de datos trata ese error como si SET ARITHABORT fuese ON. Se cancela el resto del proceso por lotes y se devuelve un mensaje de error.

Interoperabilidad
Es posible utilizar DELETE en el cuerpo de una funcin definida por el usuario si el objeto que se va a modificar es una variable de tabla. Al eliminar una fila que contiene una columna FILESTREAM, tambin elimina los archivos del sistema de archivos subyacentes. El recolector de elementos no utilizados de FILESTREAM quita los archivos subyacentes. Para obtener ms informacin, vea Obtener acceso a datos FILESTREAM con TransactSQL. No se puede especificar la clusula FROM en una instruccin DELETE que haga referencia, directa o indirectamente, a una vista que tiene definido un desencadenador INSTEAD OF. Para obtener ms informacin acerca de los desencadenadores INSTEAD OF, vea CREATE TRIGGER (Transact-SQL).

Limitaciones y restricciones

Cuando se usa TOP con DELETE, las filas a las que hace referencia no estn organizadas de ninguna manera y la clusula ORDER BY no se puede especificar directamente en esta instruccin. Si necesita utilizar TOP para eliminar filas por un orden cronolgico significativo, debe usar TOP junto con una clusula ORDER BY en una instruccin de subseleccin. Vea la seccin Ejemplos que aparece ms adelante en este tema. TOP no se puede usar en una instruccin DELETE con vistas divididas en particiones.

Comportamiento del bloqueo


De forma predeterminada, una instruccin DELETE siempre adquiere un bloqueo exclusivo (X) en la tabla que modifica y retiene ese bloqueo hasta que se completa la transaccin. Al utilizar un bloqueo exclusivo (X), el resto de las transacciones no pueden modificar los datos; las operaciones de lectura solo se pueden realizar si se utiliza la sugerencia NOLOCK o el nivel de aislamiento de lectura no confirmada. Puede especificar sugerencias de tabla para invalidar este comportamiento predeterminado durante la ejecucin de la instruccin DELETE 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). Cuando se eliminan filas de un montn, Motor de base de datos puede usar bloqueo de filas o pginas para la operacin. Como consecuencia, las pginas que han quedado vacas por la operacin de eliminacin permanecen asignadas al montn. Si no se cancela la asignacin de las pginas vacas, otros objetos de la base de datos no pueden volver a utilizar el espacio asociado. Para eliminar las filas de un montn y cancelar la asignacin de las pginas, use uno de los mtodos siguientes. Especifique la sugerencia TABLOCK en la instruccin DELETE. Si se utiliza la sugerencia TABLOCK, la operacin de eliminacin aplica un bloqueo exclusivo a la tabla, en lugar de un bloqueo de fila o de pgina. Esto permite cancelar la asignacin de las pginas. Para obtener ms informacin acerca de la sugerencia TABLOCK, vea Sugerencias de tabla (Transact-SQL). Se debe utilizar TRUNCATE TABLE si se van a eliminar todas las filas de la tabla. Cree un ndice clster en el montn antes de eliminar las filas. Puede quitar el ndice clster tras eliminar las filas. Este mtodo requiere ms tiempo que los mtodos anteriores y utiliza ms recursos temporales.

Comportamiento del registro


La instruccin DELETE siempre est registrada totalmente.

Seguridad
Permisos
Se requieren permisos DELETE en la tabla de destino. Tambin se requieren los permisos para utilizar SELECT si la instruccin contiene una clusula WHERE.

Los permisos para utilizar DELETE corresponden de forma predeterminada a los miembros del rol fijo de servidor sysadmin, de los roles fijos de base de datosdb_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 Sintaxis bsica Limitar las filas eliminadas Eliminar filas de una tabla remota

Elementos de sintaxis ofrecidos DELETE WHERE FROM cursor

Servidor vinculado funcin de conjunto conjunto de filas OPENDATASOURCE

Invalidar el comportamiento predeterminado del optimizador de consultas mediante sugerencias Capturar los resultados de la instruccin DELETE

Sugerencias de tabla sugerencias de con

Clusula OUTPUT

Sintaxis bsica
En los ejemplos de esta seccin se muestra la funcionalidad bsica de la instruccin DELETE usando la sintaxis mnima requerida.

A.Utilizar DELETE sin la clusula WHERE


En el ejemplo siguiente se eliminan todas las filas de la tabla SalesPersonQuotaHistory porque no se utiliza una clusula WHERE para limitar el nmero de filas eliminadas. Transact-SQL USE AdventureWorks2012; GO DELETE FROM Sales.SalesPersonQuotaHistory; GO

Limitar las filas eliminadas

En los ejemplos de esta seccin se muestra cmo se limita el nmero de filas que se van a eliminar.

A.Usar la clusula WHERE para eliminar un conjunto de filas


En el ejemplo siguiente se eliminan todas las filas de la tabla ProductCostHistory en las que el valor de la columna StandardCost es superior a 1000.00. Transact-SQL USE AdventureWorks2012; GO DELETE FROM Production.ProductCostHistory WHERE StandardCost > 1000.00; GO

En el siguiente ejemplo se muestra una clusula WHERE ms compleja. La clusula WHERE define dos condiciones que deben cumplirse para determinar las filas que se van a eliminar. El valor de la columna StandardCost debe estar comprendido entre 12.00 y 14.00 y el valor de la columna SellEndDate debe ser NULL. En el ejemplo se imprime tambin el valor desde la funcin @@ROWCOUNT para devolver el nmero de filas eliminadas. Transact-SQL USE AdventureWorks2012; GO DELETE Production.ProductCostHistory WHERE StandardCost BETWEEN 12.00 AND 14.00 AND EndDate IS NULL; PRINT 'Number of rows deleted is ' + CAST(@@ROWCOUNT as char(3));

B.Usar un cursor para determinar la fila que se va a eliminar

En el ejemplo siguiente se elimina una fila nica de la tabla EmployeePayHistory mediante un cursor denominado my_cursor. La operacin de eliminacin solo afecta a la nica fila que se captura actualmente del cursor. Transact-SQL 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; DELETE FROM HumanResources.EmployeePayHistory WHERE CURRENT OF complex_cursor; CLOSE complex_cursor; DEALLOCATE complex_cursor; GO

C.Usar combinaciones y subconsultas en los datos de una tabla para eliminar filas de otra tabla
En los siguientes ejemplos se muestran dos maneras de eliminar filas de una tabla en funcin de los datos de otra tabla. En ambos ejemplos, se eliminan las filas de la tabla SalesPersonQuotaHistory basndose en las ventas del ao hasta la fecha almacenadas en la tabla SalesPerson. La primera instruccin DELETE muestra la solucin de subconsulta compatible con ISO y la segunda instruccin DELETE muestra la extensin de FROM de TransactSQL para unir las dos tablas. Transact-SQL -- SQL-2003 Standard subquery USE AdventureWorks2012; GO

DELETE FROM Sales.SalesPersonQuotaHistory WHERE BusinessEntityID IN (SELECT BusinessEntityID FROM Sales.SalesPerson WHERE SalesYTD > 2500000.00); GO Transact-SQL -- Transact-SQL extension USE AdventureWorks2012; GO DELETE FROM Sales.SalesPersonQuotaHistory FROM Sales.SalesPersonQuotaHistory AS spqh INNER JOIN Sales.SalesPerson AS sp ON spqh.BusinessEntityID = sp.BusinessEntityID WHERE sp.SalesYTD > 2500000.00; GO

A.Utilizar TOP para limitar el nmero de filas eliminadas


Cuando se utiliza una clusula TOP (n) con DELETE, la operacin de eliminacin se realiza en una seleccin aleatoria de n nmero de filas. En el ejemplo siguiente se eliminan 20 filas aleatorias de la tabla PurchaseOrderDetail cuyas fechas de vencimiento sean anteriores al primero de julio de 2006. Transact-SQL USE AdventureWorks2012; GO DELETE TOP (20) FROM Purchasing.PurchaseOrderDetail WHERE DueDate < '20020701'; GO Si necesita utilizar TOP para eliminar filas por un orden cronolgico significativo, debe utilizarla junto con ORDER BY en una instruccin de subseleccin. La siguiente consulta elimina de la tabla PurchaseOrderDetail las 10 filas con las fechas de vencimiento ms antiguas. Para garantizar que solo se eliminen 10 filas, la columna especificada en la instruccin de subseleccin (PurchaseOrderID) es la clave principal de la tabla. El uso de una columna sin clave en la instruccin de subseleccin podra causar la eliminacin de ms de 10 filas si la columna especificada contiene valores duplicados. Transact-SQL USE AdventureWorks2012; GO DELETE FROM Purchasing.PurchaseOrderDetail WHERE PurchaseOrderDetailID IN (SELECT TOP 10 PurchaseOrderDetailID FROM Purchasing.PurchaseOrderDetail ORDER BY DueDate ASC); GO

Eliminar filas de una tabla remota


En los ejemplos de esta seccin se muestra cmo se eliminan filas de una tabla remota mediante un servidor vinculado o una funcin de conjunto de filas para hacer referencia a la tabla remota. Una tabla remota existe en un servidor o instancia diferente de SQL Server.

A.Eliminar datos de una tabla remota usando un servidor vinculado


En el ejemplo siguiente se eliminan filas de una tabla remota. En el ejemplo se comienza creando un vnculo al origen de datos remoto mediante sp_addlinkedserver.El nombre del servidor vinculado, MyLinkServer, se especifica entonces como parte del nombre de objeto de cuatro partes en el formatoserver.catalog.schema.object. Transact-SQL 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'SQLNCLI', @datasrc = N'server_name', @catalog = N'AdventureWorks2012'; GO Transact-SQL -- Specify the remote data source using a four-part name -- in the form linked_server.catalog.schema.object. DELETE MyLinkServer.AdventureWorks2012.HumanResources.Department WHERE DepartmentID > 16; GO

B.Eliminar datos de una tabla remota con la funcin OPENQUERY

En el ejemplo siguiente se eliminan filas de 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. Transact-SQL DELETE OPENQUERY (MyLinkServer, 'SELECT Name, GroupName FROM AdventureWorks2012.HumanResources.Department WHERE DepartmentID = 18'); GO

C.Eliminar datos de una tabla remota con una funcin OPENDATASOURCE


En el ejemplo siguiente se elimina una fila de 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. Transact-SQL DELETE FROM OPENDATASOURCE('SQLNCLI', 'Data Source= <server_name>; Integrated Security=SSPI')

.AdventureWorks2012.HumanResources.Department WHERE DepartmentID = 17;'

Capturar los resultados de la instruccin DELETE


A.Usar DELETE con la clusula OUTPUT
En el ejemplo siguiente se muestra cmo se guardan los resultados de una instruccin DELETE en una variable de tabla. Transact-SQL USE AdventureWorks2012; GO DELETE Sales.ShoppingCartItem OUTPUT DELETED.* WHERE ShoppingCartID = 20621; --Verify the rows in the table matching the WHERE clause have been deleted. SELECT COUNT(*) AS [Rows in Table] FROM Sales.ShoppingCartItem WHERE ShoppingCartID = 20621; GO

B.Usar OUTPUT con <from_table_name> en una instruccin DELETE

En el ejemplo siguiente se eliminan las filas de la tabla ProductProductPhoto segn los criterios de bsqueda definidos en la clusula FROM de la instruccin DELETE.La clusula OUTPUT devuelve columnas de la tabla que se elimina (DELETED.ProductID, DELETED.ProductPhotoID) y de la tabla Product. Esta informacin se utiliza en la clusula FROM para especificar las filas que se deben eliminar. Transact-SQL USE AdventureWorks2012; GO DECLARE @MyTableVar table ( ProductID int NOT NULL, ProductName nvarchar(50)NOT NULL, ProductModelID int NOT NULL, PhotoID int NOT NULL); DELETE Production.ProductProductPhoto OUTPUT DELETED.ProductID, p.Name, p.ProductModelID, DELETED.ProductPhotoID INTO @MyTableVar FROM Production.ProductProductPhoto AS ph JOIN Production.Product as p ON ph.ProductID = p.ProductID WHERE p.ProductModelID BETWEEN 120 and 130; --Display the results of the table variable. SELECT ProductID, ProductName, ProductModelID, PhotoID FROM @MyTableVar ORDER BY ProductModelID;

GO

NSERT (Transact-SQL)
SQL Server 2012 Otras versiones

Personas que lo han encontrado til: 3 de 3 - Valorar este tema Agrega una o varias filas a una tabla o una vista en SQL Server 2012. Para obtener ejemplos, vea Ejemplos. Convenciones de sintaxis de Transact-SQL

Sintaxis
Transact-SQL [ WITH <common_table_expression> [ ,...n ] ] INSERT { [ TOP ( expression ) [ PERCENT ] ] [ INTO ] { <object> | rowset_function_limited [ WITH ( <Table_Hint_Limited> [ ...n ] ) ] } { [ ( column_list ) ] [ <OUTPUT Clause> ] { VALUES ( { DEFAULT | NULL | expression } [ ,...n ] ) [ ,...n | derived_table | execute_statement | <dml_table_source> | DEFAULT VALUES } } } [;] <object> ::= { [ server_name . database_name . schema_name . | database_name .[ schema_name ] . | schema_name . ] table_or_view_name

} <dml_table_source> ::= SELECT <select_list> FROM ( <dml_statement_with_output_clause> ) [AS] table_alias [ ( column_alias [ ,...n ] ) ] [ WHERE <search_condition> ] [ OPTION ( <query_hint> [ ,...n ] ) ] <column_definition> ::= column_name <data_type> [ COLLATE collation_name ] [ NULL | NOT NULL ] <data type> ::= [ type_schema_name . ] type_name [ ( precision [ , scale ] | max ] -- External tool only syntax INSERT { [BULK] [ database_name . [ schema_name ] . | schema_name . ] [ table_name | view_name ] ( <column_definition> ) [ WITH ( [ [ , ] CHECK_CONSTRAINTS ] [ [ , ] FIRE_TRIGGERS ] [ [ , ] KEEP_NULLS ] [ [ , ] KILOBYTES_PER_BATCH = kilobytes_per_batch ] [ [ , ] ROWS_PER_BATCH = rows_per_batch ] [ [ , ] ORDER ( { column [ ASC | DESC ] } [ ,...n ] ) ] [ [ , ] TABLOCK ] ) ] } [; ]

Argumentos

WITH <common_table_expression> Especifica el conjunto de resultados con nombre temporal, denominado tambin expresin de tabla comn, definido en el mbito de la instruccin INSERT. El conjunto de resultados se deriva de una instruccin SELECT. Para obtener ms informacin, vea WITH common_table_expression (Transact-SQL). TOP (expression) [ PERCENT ] Especifica el nmero o el porcentaje de filas aleatorias que se van a insertar. expression puede ser un nmero o un porcentaje de las filas. Para obtener ms informacin, vea TOP (Transact-SQL).

INTO Es una palabra clave opcional que se puede utilizar entre INSERT y la tabla de destino. server_name Es el nombre del servidor vinculado en el que se encuentra la tabla o la vista. server_name puede especificarse como un nombre de servidor vinculado o usando la funcin OPENDATASOURCE. Cuando server_name se especifica como un servidor vinculado, se requieren database_name y schema_name. Cuando server_name se especifica con OPENDATASOURCE, database_name y schema_name pueden no aplicarse a todos los orgenes de datos y estar sujetos a las capacidades del proveedor OLE DB que tiene acceso al objeto remoto. database_name Es el nombre de la base de datos. schema_name Es el nombre del esquema al que pertenece la tabla o la vista. table_or view_name Es el nombre de la tabla o la vista que va a recibir los datos. Se puede utilizar una variable de tabla, en su mbito, como origen de tabla en una instruccin INSERT. 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. Por ejemplo, la instruccin INSERT de una vista de varias tablas debe utilizar una column_list que solamente haga referencia a columnas de una tabla base. Para obtener ms informacin acerca de las vistas que se pueden actualizar, vea CREATE VIEW (Transact-SQL). rowset_function_limited Especifica la funcin OPENQUERY u OPENROWSET. El uso de estas funciones est sujeto a las capacidades del proveedor OLE DB que tiene acceso al objeto remoto. WITH ( <table_hint_limited> [... n ] ) 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 READPAST, NOLOCK ni READUNCOMMITTED. Para obtener ms informacin acerca de las sugerencias de tabla, vea Sugerencias de tabla (Transact-SQL).

Importante

La posibilidad de especificar las sugerencias HOLDLOCK, SERIALIZABLE, READCOMMITTED, UPDLOCK en tablas que son destinos de instrucciones INSERT se quitar en una versin futura de S influyen en el rendimiento de las instrucciones INSERT. Evite el uso de dichas sugerencias en los nue en modificar las aplicaciones que las utilizan actualmente.

Especificar la sugerencia TABLOCK en una tabla que es el destino de una instruccin INSERT tiene el mismo efecto que especificar la sugerencia TABLOCKX. Se realiza un bloqueo exclusivo en la tabla. (column_list) Es una lista de una o ms columnas donde se van a insertar los datos. column_list se debe incluir entre parntesis y delimitar con comas. Si la columna no se incluye en column_list, Motor de base de datos debe ser capaz de proporcionar un valor basado en la definicin de la columna; de lo contrario, no se puede cargar la fila. Motor de base de datos proporciona automticamente un valor para la columna si esta: Tiene una propiedad IDENTITY. Se usa el valor de identidad incremental siguiente. Tiene un valor predeterminado. Se usa el valor predeterminado de la columna. Tiene un tipo de datos timestamp. Se utiliza el valor actual de marca de tiempo. Admite valores NULL. Se usa un valor NULL. Es una columna calculada. Se utiliza el valor calculado. Se debe usar column_list al insertar valores explcitos en una columna de identidad. La opcin SET IDENTITY_INSERT debe ser ON para la tabla. Clusula OUTPUT Devuelve las filas insertadas como parte de la operacin de insercin. Los resultados se pueden devolver a la aplicacin de procesamiento o insertarse en una tabla o variable de tabla para su nuevo procesamiento. La clusula OUTPUT no se admite en las instrucciones DML que hacen referencia a vistas locales con particiones, vistas distribuidas con particiones, tablas remotas o instrucciones INSERT que contengan una execute_statement. La clusula OUTPUT INTO no se admite en instrucciones INSERT que contengan una clusula <dml_table_source>. VALUES Presenta la lista o listas de valores de datos que se van a insertar. Debe haber un valor de datos por cada columna en column_list, si se especifica, o en la tabla. La lista de valores debe ir entre parntesis. Si los valores de la lista Value no estn en el mismo orden que las columnas de la tabla o no contienen un valor para cada columna de la tabla, se debe usar column_list para especificar de forma explcita la columna que almacenar cada valor de entrada. Puede utilizar el constructor de filas de Transact-SQL (que tambin se denomina constructor con valores de tabla) para especificar varias filas en una nica instruccin INSERT. El constructor de filas se compone de una nica clusula VALUES con varias listas de valores escritos entre parntesis y separados por una coma. Para obtener ms informacin, vea Constructor con valores de tabla (Transact-SQL). DEFAULT Hace que Motor de base de datos cargue el valor predeterminado definido para una columna. Si no existe ningn valor predeterminado para la columna y esta admite valores NULL, se inserta NULL. Para una columna definida con el tipo de datos timestamp, se inserta el siguiente valor de marca de tiempo.DEFAULT no es un valor vlido para una columna de identidad. expression

Es una constante, variable o expresin. La expresin no puede contener una instruccin EXECUTE. Cuando se hace referencia a los tipos de datos de caracteres Unicode nchar, nvarchar y ntext, debe agregarse como prefijo la letra mayscula 'N' a 'expression'. Si no se especifica 'N', SQL Server convierte la cadena en la pgina de cdigos correspondiente a la intercalacin predeterminada de la base de datos o la columna. Los caracteres que no se encuentren en esta pgina de cdigos se perdern. derived_table Es cualquier instruccin SELECT vlida que devuelva filas con los datos que se van a cargar en la tabla. La instruccin SELECT no puede contener una expresin de tabla comn (CTE). execute_statement Es cualquier instruccin EXECUTE vlida que devuelva datos con instrucciones SELECT o READTEXT. Para obtener ms informacin, vea EXECUTE (Transact-SQL). Las opciones de RESULT SETS de la instruccin EXECUTE no se pueden especificar en una instruccin INSERTEXEC. Si se usa execute_statement con INSERT, cada conjunto de resultados debe ser compatible con las columnas de la tabla o de column_list. execute_statement se puede utilizar para ejecutar procedimientos almacenados en el mismo servidor o en un servidor remoto. Se ejecuta el procedimiento en el servidor remoto, se devuelven los conjuntos de resultados al servidor local y se cargan en la tabla del servidor local. En una transaccin distribuida,execute_statement no se puede emitir en un servidor vinculado de bucle invertido cuando la conexin tiene varios conjuntos de resultados activos mltiples (MARS) habilitados. If execute_statement devuelve datos con la instruccin READTEXT, cada instruccin READTEXT puede devolver un mximo de 1 MB (1024 KB) de datos.execute_statement tambin se puede usar con procedimientos extendidos. execute_statement inserta los datos devueltos por el subproceso principal del procedimiento extendido; no obstante, los resultados de los subprocesos distintos del subproceso principal no se insertan. No puede especificar un parmetro con valores de tabla como el destino de una instruccin INSERT EXEC; sin embargo, se puede especificar como un origen en la cadena o procedimiento almacenado INSERT EXEC. Para obtener ms informacin, vea Usar parmetros con valores de tabla (motor de base de datos). <dml_table_source> Especifica que las filas insertadas en la tabla de destino son las que ha devuelto la clusula OUTPUT de una instruccin INSERT, UPDATE, DELETE o MERGE, filtradas opcionalmente por una clusula WHERE. Si se especifica <dml_table_source>, el destino de la instruccin INSERT externa debe cumplir las restricciones siguientes: Debe ser una tabla base, no una vista. No puede ser una tabla remota. No puede tener definido ningn desencadenador. No puede participar en ninguna relacin clave principal-clave externa. No puede participar en la replicacin de mezcla ni en las suscripciones actualizables para la replicacin transaccional.

El nivel de compatibilidad de la base de datos debe estar establecido en 100 o superior. Para obtener ms informacin, vea OUTPUT (clusula de Transact-SQL). <select_list> Es una lista separada por comas que especifica las columnas devueltas por la clusula OUTPUT que se tienen que insertar. Las columnas de <select_list> deben ser compatibles con las columnas en las que se insertan los valores. <select_list> no puede hacer referencia a funciones de agregado ni a TEXTPTR.

Nota

Las variables enumeradas en la lista SELECT hacen referencia a sus valores originales, sin tener en c en <dml_statement_with_output_clause>.
<dml_statement_with_output_clause> Es una instruccin INSERT, UPDATE, DELETE o MERGE vlida que devuelve las filas afectadas en una clusula OUTPUT. La instruccin no puede contener una clusula WITH y no puede tener como destino tablas remotas o vistas con particiones. Si se especifica UPDATE o DELETE, no puede ser una instruccin UPDATE o DELETE basada en cursores. No se puede hacer referencia a las filas de origen como instrucciones DML anidadas. WHERE <search_condition> Es cualquier clusula WHERE que contiene una condicin <search_condition> vlida que filtra las filas devueltas por <dml_statement_with_output_clause>. Para obtener ms informacin, vea Condiciones de bsqueda (Transact-SQL). Cuando se utiliza en este contexto, <search_condition> no puede contener subconsultas, funciones escalares definidas por el usuario que realicen acceso a datos, funciones de agregado, TEXTPTR ni predicados de bsqueda de texto completo. DEFAULT VALUES Hace que la nueva fila contenga los valores predeterminados definidos para cada columna. BULK La usan las herramientas externas para cargar un flujo de datos binarios. Esta opcin no est diseada para usarse con herramientas tales como SQL Server Management Studio, SQLCMD, OSQL ni interfaces de programacin de aplicaciones de acceso a datos como SQL Server Native Client. FIRE_TRIGGERS Especifica que se ejecutarn todos los desencadenadores de insercin definidos en la tabla de destino durante la operacin de carga de flujos de datos binarios. Para obtener ms informacin, vea BULK INSERT (Transact-SQL). CHECK_CONSTRAINTS Especifica que deben comprobarse todas las restricciones de la tabla o vista de destino durante la operacin de carga de flujos de datos binarios. Para obtener ms informacin, vea BULK INSERT (Transact-SQL). KEEPNULLS

Especifica que las columnas vacas deben conservar un valor nulo durante la operacin de carga de flujos de datos binarios. Para obtener ms informacin, vea Mantener valores NULL o usar valores predeterminados durante la importacin masiva (SQL Server). KILOBYTES_PER_BATCH = kilobytes_per_batch Especifica el nmero aproximado de kilobytes (KB) de datos por lote como kilobytes_per_batch. Para obtener ms informacin, vea BULK INSERT (Transact-SQL). ROWS_PER_BATCH =rows_per_batch Indica el nmero aproximado de filas de datos del flujo de datos binarios. Para obtener ms informacin, vea BULK INSERT (Transact-SQL). Nota Se produce un error de sintaxis si no se proporciona una lista de columnas.

Prcticas recomendadas
Utilice la funcin @@ROWCOUNT para devolver el nmero de filas insertado a la aplicacin cliente. Para obtener ms informacin, vea @@ROWCOUNT (Transact-SQL).

Prcticas recomendadas para la importacin masiva de datos


Usar INSERT INTOSELECT para realizar una importacin masiva de datos con registro mnimo
Puede usar INSERT INTO <target_table> SELECT <columns> FROM <source_table> para transferir eficazmente un gran nmero de filas de una tabla, como una tabla de ensayo, a otra tabla con registro mnimo. El registro mnimo puede mejorar el rendimiento de la instruccin y reducir la posibilidad de que la operacin rellene el espacio del registro de transacciones disponible durante la transaccin. El registro mnimo para esta instruccin tiene los requisitos siguientes: El modelo de recuperacin de la base de datos est establecido en registro simple o masivo. La tabla de destino es un montn vaco o no vaco. La tabla de destino no se usa en la replicacin. La sugerencia TABLOCK se especifica para la tabla de destino. Las filas que se insertan en un montn como el resultado de una accin de insercin en una instruccin MERGE tambin se pueden registrar con un nivel mnimo. A diferencia de la instruccin BULK INSERT, que contiene un bloqueo Bulk Update menos restrictivo, INSERT INTOSELECT con la sugerencia TABLOCK retiene un bloqueo exclusivo (X) en la tabla. Esto significa que no se pueden insertar filas mediante operaciones de insercin en paralelo.

Usar OPENROWSET y BULK para datos de importacin masiva


La funcin OPENROWSET puede aceptar las siguientes sugerencias de tabla, que proporcionan optimizaciones de carga masiva con la instruccin INSERT: La sugerencia TABLOCK puede reducir al mnimo el nmero de registros para la operacin de insercin. El modelo de recuperacin de la base de datos debe establecerse en registro simple o masivo, y la tabla de destino no se puede utilizar en la replicacin. Para obtener ms informacin, vea Requisitos previos para el registro mnimo durante la importacin masiva. La sugerencia IGNORE_CONSTRAINTS puede deshabilitar temporalmente la comprobacin de restricciones FOREIGN KEY y CHECK.

La sugerencia IGNORE_TRIGGERS puede deshabilitar temporalmente la ejecucin de desencadenadores. La sugerencia KEEPDEFAULTS permite la insercin del valor predeterminado de la columna de una tabla, si existe, en lugar de NULL, cuando falta el valor del registro de datos de esa columna. La sugerencia KEEPIDENTITY permite que se usen los valores de identidad en el archivo de datos importado para la columna de identidad en la tabla de destino. Estas optimizaciones son similares a las que estn disponibles con el comando BULK INSERT. Para obtener ms informacin, vea Sugerencias de tabla (Transact-SQL).

Tipos de datos
Al insertar filas, considere el comportamiento de los tipos de datos siguientes: Si se va a cargar un valor en columnas con un tipo de datos char, varchar o varbinary, el relleno o el truncamiento de los espacios en blanco finales (espacios para char y varchar, y ceros para varbinary) se determinan mediante el valor de la opcin SET ANSI_PADDING definida para la columna al crear la tabla. Para obtener ms informacin, vea SET ANSI_PADDING (Transact-SQL). En la siguiente tabla se muestra la operacin predeterminada cuando SET ANSI_PADDING es OFF.

Tipo de datos char varchar

Operacin predeterminada Rellena el valor con espacios hasta el ancho definido de la columna.

Quita los espacios finales hasta el ltimo carcter distinto de espacio o hasta un ca cadenas compuestas solamente de espacios. Quita los ceros finales.

varbinary

Si se carga una cadena vaca (' ') en una columna con un tipo de datos varchar o text, la operacin predeterminada consiste en cargar una cadena de longitud cero. Al insertar un valor NULL en una columna text o image, no se crea un puntero de texto vlido ni se asigna previamente una pgina de texto de 8 KB. En las columnas creadas con el tipo de datos uniqueidentifier se almacenan valores binarios de 16 bytes con formato especial. A diferencia de las columnas de identidad, Motor de base de datos no genera automticamente valores de columnas con el tipo de datos uniqueidentifier. Durante una operacin de insercin, se pueden usar variables con un tipo de datos uniqueidentifier y constantes de cadena con el formato xxxxxxxx-xxxxxxxx-xxxx-xxxxxxxxxxxx (36 caracteres incluidos los guiones, donde x es un dgito hexadecimal de los intervalos 0-9 o a-f) para las columnas uniqueidentifier. Por ejemplo, 6F9619FF-8B86-D011-B42D-00C04FC964FF es un valor vlido para una columna o variable uniqueidentifier. Utilice la funcin NEWID() para obtener un identificador nico global (GUID).

Insertar valores en columnas de tipo definido por el usuario


Puede insertar valores en columnas de tipo definido por el usuario si: Proporciona un valor del tipo definido por el usuario. Suministra 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 siguiente ejemplo se muestra cmo insertar un valor en una columna de tipo definido por el usuario Point mediante la conversin explcita a partir de una cadena. INSERT INTO Cities (Location) VALUES ( CONVERT(Point, '12.3:46.2') ); Tambin se puede suministrar un valor binario sin realizar ninguna conversin explcita, dado que todos los tipos definidos por el usuario se pueden convertir implcitamente a partir de este valor binario. Llama a una funcin definida por el usuario que devuelve un valor del tipo definido por el usuario. En el siguiente ejemplo se utiliza una funcin CreateNewPoint() definida por el usuario para crear un valor nuevo del tipo Point definido por el usuario e insertar el valor en la tabla Cities. INSERT INTO Cities (Location) VALUES ( dbo.CreateNewPoint(x, y) );

Tratamiento de errores

Puede implementar el tratamiento de errores para la instruccin INSERT especificando la instruccin en una construccin TRYCATCH. Si una instruccin INSERT infringe una restriccin o una regla, o si contiene un valor incompatible con el tipo de datos de la columna, la instruccin no se puede ejecutar y se recibe un mensaje de error. Si INSERT carga varias filas con SELECT o EXECUTE, cualquier infraccin de una regla o restriccin que se produzca en los valores que se cargan provoca que se detenga la instruccin y que no se carguen filas. Cuando una instruccin INSERT detecta un error aritmtico (desbordamiento, divisin entre cero o error de dominio) al evaluar una expresin, Motor de base de datos trata dichos errores como si SET ARITHABORT estuviera establecido en ON. El lote se detiene y se devuelve un mensaje de error. Al evaluar una expresin con SET ARITHABORT y SET ANSI_WARNINGS en OFF, si una instruccin INSERT, DELETE o UPDATE encuentra un error aritmtico, desbordamiento, divisin entre cero o error de dominio, SQL Server inserta o actualiza un valor NULL. Si la columna de destino no acepta valores NULL, no se puede efectuar la accin de insercin o actualizacin y el usuario recibe un error.

Interoperabilidad
Cuando se define un desencadenador INSTEAD OF en las acciones INSERT en una tabla o vista, se ejecuta el desencadenador en lugar de la instruccin INSERT. Para obtener ms informacin acerca de los desencadenadores INSTEAD OF, vea CREATE TRIGGER (Transact-SQL).

Limitaciones y restricciones

Cuando se insertan valores en tablas remotas y no se especifican todos los valores de todas las columnas, debe identificar las columnas en las que se deben insertar los valores especificados. Cuando se utiliza TOP con INSERT las filas a las que hace referencia no estn organizadas de ninguna manera y la clusula ORDER BY no se puede especificar directamente en esta instruccin. Si necesita usar TOP para insertar las filas en un orden cronolgico significativo, debe utilizar TOP junto con una clusula ORDER BY que se especifica en una instruccin de subseleccin. Vea la seccin Ejemplos que aparece ms adelante en este tema.

Comportamiento del registro


La instruccin INSERT siempre se registra completamente excepto cuando se usa la funcin OPENROWSET con la palabra clave BULK o cuando se usa INSERT INTO <target_table> SELECT <columns> FROM <source_table>. Estas operaciones pueden ser registradas mnimamente. Para obtener ms informacin, vea la seccin "Prcticas recomendadas para la carga masiva de datos" anteriormente en este tema.

Seguridad
Durante una conexin de servidores vinculados, el servidor de envo proporciona un nombre de inicio de sesin y una contrasea para conectarse en su nombre al servidor de recepcin. Para que esta conexin funcione, debe crear una asignacin de inicio de sesin entre los servidores vinculados utilizandosp_addlinkedsrvlogin. Cuando utilice OPENROWSET (BULK), es importante que entienda el modo en el que SQL Server controla la suplantacin. Para obtener ms informacin, vea "Consideraciones de seguridad" en Importar de forma masiva datos mediante BULK INSERT u OPENROWSET(BULK...) (SQL Server).

Permisos
El permiso INSERT es obligatorio en la tabla de destino. Los permisos para INSERT se adjudican de forma predeterminada a los miembros del rol fijo de servidor sysadmin, a los roles fijos de base de datos db_owner ydb_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. Para ejecutar INSERT con la opcin BULK de la funcin OPENROWSET, debe ser miembro del rol fijo de servidor sysadmin o bulkadmin.

Ejemplos

Categora Sintaxis bsica Tratar los valores de columna

Elementos de sintaxis ofrecidos

INSERT constructor con valores de tab

IDENTITY NEWID valores predeterm

usuario Insertar datos de otras tablas

INSERTSELECT INSERTEXECU comn TOP OFFSET FETCH Vistas variables de tabla

Especificar objetos de destino que no sean tablas estndar Insertar filas en una tabla remota

Servidor vinculado funcin de conjunto conjunto de filas OPENDATASOURCE

Cargar datos de forma masiva de tablas o archivos de datos Invalidar el comportamiento predeterminado del optimizador de consultas mediante sugerencias Capturar los resultados de la instruccin INSERT

INSERTSELECT funcin OPENRO Sugerencias de tabla

Clusula OUTPUT

Sintaxis bsica
Los ejemplos de esta seccin demuestran la funcionalidad bsica de la instruccin INSERT usando la sintaxis mnima requerida.

A.Insertar una sola fila de datos


En el siguiente ejemplo se inserta una fila en la tabla Production.UnitMeasure. Las columnas de esta tabla son UnitMeasureCode, Name y ModifiedDate. Dado que los valores para todas las columnas se suministran e incluyen en el mismo orden que las columnas de la tabla, no es necesario especificar los nombres de columna en la lista de columnas. Transact-SQL USE AdventureWorks2012; GO INSERT INTO Production.UnitMeasure VALUES (N'FT', N'Feet', '20080414'); GO

B.Insertar varias filas de datos

En el siguiente ejemplo se usa el constructor de valores de tabla para insertar tres filas en la tabla Production.UnitMeasure en una instruccin INSERT. Dado que los valores para todas las columnas se suministran e incluyen en el mismo orden que las columnas de la tabla, no es necesario especificar los nombres de columna en la lista de columnas. Transact-SQL USE AdventureWorks2012; GO INSERT INTO Production.UnitMeasure VALUES (N'FT2', N'Square Feet ', '20080923'), (N'Y', N'Yards', '20080923'), (N'Y3', N'Cubic Yards', '20080923'); GO

C.Insertar datos que no estn en el mismo orden que las columnas de la tabla
En el siguiente ejemplo se utiliza una lista de columnas para especificar de forma explcita los valores insertados en cada columna. El orden de las columnas de la tabla Production.UnitMeasure es UnitMeasureCode, Name, ModifiedDate; no obstante, las columnas no se incluyen en dicho orden en column_list. Transact-SQL USE AdventureWorks2012; GO INSERT INTO Production.UnitMeasure (Name, UnitMeasureCode, ModifiedDate) VALUES (N'Square Yards', N'Y2', GETDATE()); GO

Tratar los valores de columna

Los ejemplos de esta seccin demuestran mtodos para insertar valores en columnas que se definen con una propiedad IDENTITY, un valor DEFAULT o se definen con tipos de datos como uniqueidentifer o columnas de un tipo definido por el usuario.

A.Insertar datos en una tabla con columnas que tienen valores predeterminados
En el ejemplo siguiente se muestra la insercin de filas en una tabla con columnas que generan automticamente un valor o tienen un valor predeterminado. Column_1 es una columna calculada que genera automticamente un valor concatenando una cadena con el valor insertado en column_2. Column_2 se define con una restriccin predeterminada. Si no se especifica un valor para esta columna, se usar el valor predeterminado. Column_3 se define con el tipo de datosrowversion, que genera automticamente un nmero binario nico que se incrementa. Column_4 no genera automticamente ningn valor. Cuando no se especifica un valor para esta columna, se inserta NULL. La instruccin INSERT inserta filas que contienen valores para algunas de las columnas, pero no para todas. En la ltima instruccin INSERT, no se especifica ninguna columna y solamente se insertan los valores predeterminados con la clusula DEFAULT VALUES. Transact-SQL USE AdventureWorks2012; GO IF OBJECT_ID ('dbo.T1', 'U') IS NOT NULL DROP TABLE dbo.T1; GO CREATE TABLE dbo.T1 ( column_1 AS 'Computed column ' + column_2, column_2 varchar(30) CONSTRAINT default_name DEFAULT ('my column default'), column_3 rowversion, column_4 varchar(40) NULL ); GO INSERT INTO dbo.T1 (column_4) VALUES ('Explicit value'); INSERT INTO dbo.T1 (column_2, column_4) VALUES ('Explicit value', 'Explicit value');

INSERT INTO dbo.T1 (column_2) VALUES ('Explicit value'); INSERT INTO T1 DEFAULT VALUES; GO SELECT column_1, column_2, column_3, column_4 FROM dbo.T1; GO

B.Insertar datos en una tabla con una columna de identidad


En el siguiente ejemplo se muestran los distintos mtodos para insertar datos en una columna de identidad. Las dos primeras instrucciones INSERT permiten generar valores de identidad para las filas nuevas. La tercera instruccin INSERT invalida la propiedad IDENTITY de la columna con la instruccin SET IDENTITY_INSERT e inserta un valor explcito en la columna de identidad. Transact-SQL USE AdventureWorks2012; GO IF OBJECT_ID ('dbo.T1', 'U') IS NOT NULL DROP TABLE dbo.T1; GO CREATE TABLE dbo.T1 ( column_1 int IDENTITY, column_2 VARCHAR(30)); GO INSERT T1 VALUES ('Row #1'); INSERT T1 (column_2) VALUES ('Row #2'); GO SET IDENTITY_INSERT T1 ON; GO INSERT INTO T1 (column_1,column_2) VALUES (-99, 'Explicit identity value'); GO SELECT column_1, column_2 FROM T1; GO

C.Insertar datos en una columna uniqueidentifier mediante NEWID()

En el siguiente ejemplo se utiliza la funcin NEWID() para obtener un GUID para column_2. A diferencia de las columnas de identidad, Motor de base de datos no genera automticamente valores de columnas con el tipo de datos uniqueidentifier, segn se muestra en la segunda instruccin INSERT. Transact-SQL USE AdventureWorks2012; GO IF OBJECT_ID ('dbo.T1', 'U') IS NOT NULL DROP TABLE dbo.T1; GO CREATE TABLE dbo.T1 ( column_1 int IDENTITY, column_2 uniqueidentifier, ); GO

INSERT INTO dbo.T1 (column_2) VALUES (NEWID()); INSERT INTO T1 DEFAULT VALUES; GO SELECT column_1, column_2 FROM dbo.T1; GO

D.Insertar datos en columnas de tipo definido por el usuario


Las siguientes instrucciones de Transact-SQL insertan tres filas en la columna PointValue de la tabla Points. Esta columna usa un tipo definido por el usuario CLR(UDT). El tipo de datos Point est compuesto por valores enteros X e Y que se exponen como propiedades del UDT. Debe utilizar las funciones CAST o CONVERT para convertir los valores X e Y separados por comas al tipo Point. Las dos primeras instrucciones utilizan la funcin CONVERT para convertir un valor de cadena al tipo Point y la tercera utiliza la funcin CAST. Para obtener ms informacin, vea Manipular datos UDT. INSERT INTO dbo.Points (PointValue) VALUES (CONVERT(Point, '3,4')); INSERT INTO dbo.Points (PointValue) VALUES (CONVERT(Point, '1,5')); INSERT INTO dbo.Points (PointValue) VALUES (CAST ('1,99' AS Point));

Insertar datos de otras tablas

Los ejemplos de esta seccin demuestran mtodos para insertar filas de una tabla en otra.

A.Usar las opciones SELECT y EXECUTE para insertar datos de otras tablas
En el siguiente ejemplo se muestra cmo insertar datos de una tabla en otra mediante INSERTSELECT o INSERTEXECUTE. Cada uno se basa en una instruccin SELECT con varias tablas que contiene una expresin y un valor literal en la lista de columnas. La primera instruccin INSERT usa una instruccin SELECT para derivar los datos de las tablas de origen (Employee, SalesPerson y Person) y almacenar el conjunto de resultados en la tabla EmployeeSales . La segunda instruccin INSERT usa la clusula EXECUTE para llamar a un procedimiento almacenado que contiene la instruccin SELECT y la tercera instruccin INSERT usa la clusula EXECUTE para hacer referencia a la instruccin SELECT como una cadena literal. Transact-SQL USE AdventureWorks2012; GO IF OBJECT_ID ('dbo.EmployeeSales', 'U') IS NOT NULL DROP TABLE dbo.EmployeeSales; GO IF OBJECT_ID ('dbo.uspGetEmployeeSales', 'P') IS NOT NULL DROP PROCEDURE uspGetEmployeeSales; GO CREATE TABLE dbo.EmployeeSales ( DataSource varchar(20) NOT NULL, BusinessEntityID varchar(11) NOT NULL, LastName varchar(40) NOT NULL, SalesDollars money NOT NULL ); GO CREATE PROCEDURE dbo.uspGetEmployeeSales AS SET NOCOUNT ON;

SELECT 'PROCEDURE', sp.BusinessEntityID, c.LastName, sp.SalesYTD FROM Sales.SalesPerson AS sp INNER JOIN Person.Person AS c ON sp.BusinessEntityID = c.BusinessEntityID WHERE sp.BusinessEntityID LIKE '2%' ORDER BY sp.BusinessEntityID, c.LastName; GO --INSERT...SELECT example INSERT INTO dbo.EmployeeSales SELECT 'SELECT', sp.BusinessEntityID, c.LastName, sp.SalesYTD FROM Sales.SalesPerson AS sp INNER JOIN Person.Person AS c ON sp.BusinessEntityID = c.BusinessEntityID WHERE sp.BusinessEntityID LIKE '2%' ORDER BY sp.BusinessEntityID, c.LastName; GO --INSERT...EXECUTE procedure example INSERT INTO dbo.EmployeeSales EXECUTE dbo.uspGetEmployeeSales; GO --INSERT...EXECUTE('string') example INSERT INTO dbo.EmployeeSales EXECUTE (' SELECT ''EXEC STRING'', sp.BusinessEntityID, c.LastName, sp.SalesYTD FROM Sales.SalesPerson AS sp INNER JOIN Person.Person AS c ON sp.BusinessEntityID = c.BusinessEntityID WHERE sp.BusinessEntityID LIKE ''2%'' ORDER BY sp.BusinessEntityID, c.LastName '); GO --Show results. SELECT DataSource,BusinessEntityID,LastName,SalesDollars FROM dbo.EmployeeSales; GO

B.Usar la expresin de tabla comn WITH para definir los datos insertados
En el siguiente ejemplo se crea la tabla NewEmployee. Una expresin de tabla comn (EmployeeTemp) define las filas de una o varias tablas que se van a insertar en la tabla NewEmployee. La instruccin INSERT hace referencia a las columnas de la expresin de tabla comn. Transact-SQL USE AdventureWorks2012; GO IF OBJECT_ID (N'HumanResources.NewEmployee', N'U') IS NOT NULL DROP TABLE HumanResources.NewEmployee; GO

CREATE TABLE HumanResources.NewEmployee ( EmployeeID int NOT NULL, LastName nvarchar(50) NOT NULL, FirstName nvarchar(50) NOT NULL, PhoneNumber Phone NULL, AddressLine1 nvarchar(60) NOT NULL, City nvarchar(30) NOT NULL, State nchar(3) NOT NULL, PostalCode nvarchar(15) NOT NULL, CurrentFlag Flag ); GO WITH EmployeeTemp (EmpID, LastName, FirstName, Phone, Address, City, StateProvince, PostalCode, CurrentFlag) AS (SELECT e.BusinessEntityID, c.LastName, c.FirstName, pp.PhoneNumber, a.AddressLine1, a.City, sp.StateProvinceCode, a.PostalCode, e.CurrentFlag FROM HumanResources.Employee e INNER JOIN Person.BusinessEntityAddress AS bea ON e.BusinessEntityID = bea.BusinessEntityID INNER JOIN Person.Address AS a ON bea.AddressID = a.AddressID INNER JOIN Person.PersonPhone AS pp ON e.BusinessEntityID = pp.BusinessEntityID INNER JOIN Person.StateProvince AS sp ON a.StateProvinceID = sp.StateProvinceID INNER JOIN Person.Person as c ON e.BusinessEntityID = c.BusinessEntityID ) INSERT INTO HumanResources.NewEmployee SELECT EmpID, LastName, FirstName, Phone, Address, City, StateProvince, PostalCode, CurrentFlag FROM EmployeeTemp; GO

C.Usar TOP para limitar los datos insertados de la tabla de origen

En el siguiente ejemplo se crea la tabla EmployeeSales y se insertan el nombre y los datos de ventas del ao hasta la fecha para los primeros 5 empleados aleatorios de la tabla HumanResources.Employee. La instruccin INSERT elige cualquiera de las 5 filas devueltas por la instruccin SELECT. La clusula OUTPUT muestra las filas que se insertan en la tabla EmployeeSales. Observe que la clusula ORDER BY de la instruccin SELECT no se utiliza para determinar los primeros 5 empleados. Transact-SQL USE AdventureWorks2012 ; GO IF OBJECT_ID ('dbo.EmployeeSales', 'U') IS NOT NULL DROP TABLE dbo.EmployeeSales;

GO CREATE TABLE dbo.EmployeeSales ( EmployeeID nvarchar(11) NOT NULL, LastName nvarchar(20) NOT NULL, FirstName nvarchar(20) NOT NULL, YearlySales money NOT NULL ); GO INSERT TOP(5)INTO dbo.EmployeeSales OUTPUT inserted.EmployeeID, inserted.FirstName, inserted.LastName, inserted.YearlySales SELECT sp.BusinessEntityID, c.LastName, c.FirstName, sp.SalesYTD FROM Sales.SalesPerson AS sp INNER JOIN Person.Person AS c ON sp.BusinessEntityID = c.BusinessEntityID WHERE sp.SalesYTD > 250000.00 ORDER BY sp.SalesYTD DESC; Si necesita usar TOP para insertar las filas en un orden cronolgico significativo, debe utilizar TOP junto con ORDER BY en una instruccin de subseleccin, tal y como se muestra en el siguiente ejemplo. La clusula OUTPUT muestra las filas que se insertan en la tabla EmployeeSales. Observe que los primeros 5 empleados se insertan ahora segn los resultados de la clusula ORDER BY en lugar de las filas aleatorias. Transact-SQL INSERT INTO dbo.EmployeeSales OUTPUT inserted.EmployeeID, inserted.FirstName, inserted.LastName, inserted.YearlySales SELECT TOP (5) sp.BusinessEntityID, c.LastName, c.FirstName, sp.SalesYTD FROM Sales.SalesPerson AS sp INNER JOIN Person.Person AS c ON sp.BusinessEntityID = c.BusinessEntityID WHERE sp.SalesYTD > 250000.00 ORDER BY sp.SalesYTD DESC;

Especificar objetos de destino que no sean tablas estndar


A.Insertar datos especificando una vista

En los ejemplos de esta seccin se muestra cmo insertar filas especificando una variable de tabla o vista. En el siguiente ejemplo se especifica un nombre de vista como objeto de destino; sin embargo, la fila nueva se inserta en la tabla base subyacente. El orden de los valores de la instruccin INSERT debe coincidir con el orden de las columnas de la vista. Para obtener ms informacin, vea Modificar datos mediante una vista. Transact-SQL USE AdventureWorks2012; GO IF OBJECT_ID ('dbo.T1', 'U') IS NOT NULL DROP TABLE dbo.T1; GO IF OBJECT_ID ('dbo.V1', 'V') IS NOT NULL

DROP VIEW dbo.V1; GO CREATE TABLE T1 ( column_1 int, column_2 varchar(30)); GO CREATE VIEW V1 AS SELECT column_2, column_1 FROM T1; GO INSERT INTO V1 VALUES ('Row 1',1); GO SELECT column_1, column_2 FROM T1; GO SELECT column_1, column_2 FROM V1; GO

B.Insertar datos en una variable de tabla

En el siguiente ejemplo se especifica una variable de tabla como el objeto de destino. Transact-SQL USE AdventureWorks2012; GO -- Create the table variable. DECLARE @MyTableVar table( LocationID int NOT NULL, CostRate smallmoney NOT NULL, NewCostRate AS CostRate * 1.5, ModifiedDate datetime); -- Insert values into the table variable. INSERT INTO @MyTableVar (LocationID, CostRate, ModifiedDate) SELECT LocationID, CostRate, GETDATE() FROM Production.Location WHERE CostRate > 0; -- View the table variable result set. SELECT * FROM @MyTableVar; GO

Insertar filas en una tabla remota

Los ejemplos de esta seccin demuestran cmo insertar filas en una tabla de destino remota mediante un servidor vinculado o una funcin de conjunto de filas para hacer referencia a la tabla remota.

A.Insertar datos en una tabla remota mediante un servidor vinculado


El ejemplo siguiente inserta filas en una tabla remota. En el ejemplo se comienza creando un vnculo al origen de datos remoto mediante sp_addlinkedserver. El nombre del servidor vinculado, MyLinkServer, se especifica entonces como parte del nombre de objeto de cuatro partes en el formato server.catalog.schema.object. Transact-SQL

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'SQLNCLI', @datasrc = N'server_name', @catalog = N'AdventureWorks2012'; GO Transact-SQL USE AdventureWorks2012; GO -- Specify the remote data source in the FROM clause using a four-part name -- in the form linked_server.catalog.schema.object. INSERT INTO MyLinkServer.AdventureWorks2012.HumanResources.Department (Name, GroupName) VALUES (N'Public Relations', N'Executive General and Administration'); GO

B.Insertar datos en una tabla remota con una funcin OPENQUERY

En el ejemplo siguiente se inserta 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. Transact-SQL -- Use the OPENQUERY function to access the remote data source. INSERT OPENQUERY (MyLinkServer, 'SELECT Name, GroupName FROM AdventureWorks2012.HumanResources.Department') VALUES ('Environmental Impact', 'Engineering'); GO

C.Insertar datos en una tabla remota con una 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. Transact-SQL -- Use the OPENDATASOURCE function to specify the remote data source. -- Specify a valid server name for Data Source using the format server_name or server_name\instance_name. INSERT INTO OPENDATASOURCE('SQLNCLI', 'Data Source= <server_name>; Integrated Security=SSPI') .AdventureWorks2012.HumanResources.Department (Name, GroupName) VALUES (N'Standards and Methods', 'Quality Assurance'); GO

Cargar datos de forma masiva de tablas o archivos de datos


Los ejemplos de esta seccin muestran dos mtodos para cargar datos de forma masiva en una tabla mediante la instruccin INSERT.

A.Insertar datos en un montn con registro mnimo


El ejemplo siguiente crea una tabla nueva (un montn) e inserta los datos en ella desde otra tabla con registro mnimo. El ejemplo supone que el modelo de recuperacin de la base de datos AdventureWorks2012 est establecido en FULL. Para asegurarse de que se utiliza el registro mnimo, el modelo de recuperacin de la base de datos AdventureWorks2012 se establece en BULK_LOGGED antes de que las filas se inserten y se restablece en FULL despus de la instruccin INSERT INTOSELECT. Adems, se especifica la sugerencia TABLOCK para la tabla de destino Sales.SalesHistory. Esto asegura que la instruccin use el espacio mnimo en el registro de transacciones y funcione eficazmente. Transact-SQL USE AdventureWorks2012; GO -- Create the target heap. CREATE TABLE Sales.SalesHistory( SalesOrderID int NOT NULL, SalesOrderDetailID int NOT NULL, CarrierTrackingNumber nvarchar(25) NULL, OrderQty smallint NOT NULL, ProductID int NOT NULL, SpecialOfferID int NOT NULL, UnitPrice money NOT NULL, UnitPriceDiscount money NOT NULL, LineTotal money NOT NULL, rowguid uniqueidentifier ROWGUIDCOL NOT NULL, ModifiedDate datetime NOT NULL ); GO -- Temporarily set the recovery model to BULK_LOGGED. ALTER DATABASE AdventureWorks2012 SET RECOVERY BULK_LOGGED; GO -- Transfer data from Sales.SalesOrderDetail to Sales.SalesHistory INSERT INTO Sales.SalesHistory WITH (TABLOCK) (SalesOrderID, SalesOrderDetailID, CarrierTrackingNumber, OrderQty, ProductID, SpecialOfferID, UnitPrice, UnitPriceDiscount, LineTotal, rowguid, ModifiedDate) SELECT * FROM Sales.SalesOrderDetail; GO

-- Reset the recovery model. ALTER DATABASE AdventureWorks2012 SET RECOVERY FULL; GO

B.Usar la funcin OPENROWSET con BULK para cargar datos de forma masiva en una tabla
En el ejemplo siguiente se insertan filas de un archivo de datos en una tabla especificando la funcin OPENROWSET. La sugerencia de tabla IGNORE_TRIGGERS se especifica para la optimizacin del rendimiento. Para obtener ms ejemplos, vea Importar de forma masiva datos mediante BULK INSERT u OPENROWSET(BULK...) (SQL Server). Transact-SQL -- Use the OPENROWSET function to specify the data source and specifies the IGNORE_TRIGGERS table hint. INSERT INTO HumanResources.Department WITH (IGNORE_TRIGGERS) (Name, GroupName) SELECT b.Name, b.GroupName FROM OPENROWSET ( BULK 'C:\SQLFiles\DepartmentData.txt', FORMATFILE = 'C:\SQLFiles\BulkloadFormatFile.xml', ROWS_PER_BATCH = 15000)AS b ; GO

Invalidar el comportamiento predeterminado del optimizador de consultas mediante sugerencias

Los ejemplos de esta seccin demuestran cmo usar sugerencias de tabla para invalidar de forma temporal el comportamiento predeterminado del optimizador de consultas cuando se procesa la instruccin INSERT.

Advertencia

Como el optimizador de consultas de SQL Server suele seleccionar el mejor plan de ejecucin de una consult los administradores de bases de datos y desarrolladores experimentados utilicen las sugerencias como ltimo

A.Usar la sugerencia TABLOCK para especificar un mtodo de bloqueo


En el ejemplo siguiente se especifica que se aplique un bloqueo exclusivo (X) en la tabla Production.Location y que se mantenga hasta que finalice la instruccin INSERT. Transact-SQL USE AdventureWorks2012; GO INSERT INTO Production.Location WITH (XLOCK) (Name, CostRate, Availability) VALUES ( N'Final Inventory', 15.00, 80.00); GO

Capturar los resultados de la instruccin INSERT


Los ejemplos de esta seccin demuestran cmo usar la clusula OUTPUT para devolver informacin de cada fila afectada por una instruccin INSERT 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 OUTPUT con una instruccin INSERT


En el siguiente ejemplo se inserta una fila en la tabla ScrapReason y se utiliza la clusula OUTPUT para devolver los resultados de la instruccin a la variable de la tabla @MyTableVar. Dado que la columna ScrapReasonID se define con una propiedad IDENTITY, no se especifica ningn valor en la instruccin INSERT para dicha columna. No obstante, debe tener en cuenta que el valor generado por Motor de base de datos para la columna se devuelve en la clusula OUTPUT de la columnaINSERTED.ScrapReasonID. Transact-SQL USE AdventureWorks2012; GO DECLARE @MyTableVar table( NewScrapReasonID smallint, Name varchar(50), ModifiedDate datetime); INSERT Production.ScrapReason OUTPUT INSERTED.ScrapReasonID, INSERTED.Name, INSERTED.ModifiedDate INTO @MyTableVar VALUES (N'Operator error', GETDATE()); --Display the result set of the table variable. SELECT NewScrapReasonID, Name, ModifiedDate FROM @MyTableVar; --Display the result set of the table. SELECT ScrapReasonID, Name, ModifiedDate FROM Production.ScrapReason; GO

B.Usar OUTPUT con columnas de identidad y calculadas

En el siguiente ejemplo se crea la tabla EmployeeSales y, a continuacin, se insertan varias filas en ella usando una instruccin INSERT con una instruccin SELECT para recuperar los datos de las tablas de origen. La tabla EmployeeSales contiene una columna de identidad (EmployeeID) y una columna calculada (ProjectedSales). Puesto que Motor de base de datos genera estos valores durante la operacin de insercin, ninguna de estas columnas se puede definir en @MyTableVar. Transact-SQL USE AdventureWorks2012 ; GO IF OBJECT_ID ('dbo.EmployeeSales', 'U') IS NOT NULL DROP TABLE dbo.EmployeeSales; GO CREATE TABLE dbo.EmployeeSales ( EmployeeID int IDENTITY (1,5)NOT NULL, LastName nvarchar(20) NOT NULL, FirstName nvarchar(20) NOT NULL, CurrentSales money NOT NULL, ProjectedSales AS CurrentSales * 1.10 ); GO DECLARE @MyTableVar table(

LastName nvarchar(20) NOT NULL, FirstName nvarchar(20) NOT NULL, CurrentSales money NOT NULL ); INSERT INTO dbo.EmployeeSales (LastName, FirstName, CurrentSales) OUTPUT INSERTED.LastName, INSERTED.FirstName, INSERTED.CurrentSales INTO @MyTableVar SELECT c.LastName, c.FirstName, sp.SalesYTD FROM Sales.SalesPerson AS sp INNER JOIN Person.Person AS c ON sp.BusinessEntityID = c.BusinessEntityID WHERE sp.BusinessEntityID LIKE '2%' ORDER BY c.LastName, c.FirstName; SELECT LastName, FirstName, CurrentSales FROM @MyTableVar; GO SELECT EmployeeID, LastName, FirstName, CurrentSales, ProjectedSales FROM dbo.EmployeeSales; GO

C.Insertar los datos devueltos por una clusula OUTPUT

En el ejemplo siguiente se capturan los datos devueltos por la clusula OUTPUT de una instruccin MERGE y se insertan en otra tabla. La instruccin MERGE actualiza diariamente la columna Quantity de la tabla ProductInventory basndose en los pedidos procesados en la tabla SalesOrderDetail. Tambin elimina las filas correspondientes a los productos cuyas existencias se colocan en el valor 0. En el ejemplo se capturan las filas que se eliminan y se insertan en otra tabla,ZeroInventory, que realiza el seguimiento de los productos sin existencias. Transact-SQL USE AdventureWorks2012; GO IF OBJECT_ID(N'Production.ZeroInventory', N'U') IS NOT NULL DROP TABLE Production.ZeroInventory; GO --Create ZeroInventory table. CREATE TABLE Production.ZeroInventory (DeletedProductID int, RemovedOnDate DateTime); GO INSERT INTO Production.ZeroInventory (DeletedProductID, RemovedOnDate) SELECT ProductID, GETDATE() FROM ( MERGE Production.ProductInventory AS pi USING (SELECT ProductID, SUM(OrderQty) FROM Sales.SalesOrderDetail AS sod JOIN Sales.SalesOrderHeader AS soh ON sod.SalesOrderID = soh.SalesOrderID AND soh.OrderDate = '20070401'

GROUP BY ProductID) AS src (ProductID, OrderQty) ON (pi.ProductID = src.ProductID) WHEN MATCHED AND pi.Quantity - src.OrderQty <= 0 THEN DELETE WHEN MATCHED THEN UPDATE SET pi.Quantity = pi.Quantity - src.OrderQty OUTPUT $action, deleted.ProductID) AS Changes (Action, ProductID) WHERE Action = 'DELETE'; IF @@ROWCOUNT = 0 PRINT 'Warning: No rows were inserted'; GO SELECT DeletedProductID, RemovedOnDate FROM Production.ZeroInventory;

UPDATE (Transact-SQL)
SQL Server 2012 Otras versiones

Personas que lo han encontrado til: 5 de 5 - Valorar este tema Cambia los datos de una tabla o vista de SQL Server 2012. Para obtener ejemplos, vea Ejemplos. 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 . ] 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, veaCREATE 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 por expressionsustituye 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 a mayscula 'N' a 'expression'. Si no se especifica 'N', SQL Server convierte la cadena a la pgina de c intercalacin predeterminada de la base de datos o columna. Los caracteres que no se encuentren en e
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 de column_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 usa para incrementar column_name. expression se debe evaluar, o bien se debe poder convertir implcitamente al tipo column_name. Si expression 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 bigint y 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 en 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> 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 ev independiente de otras llamadas a estas funciones utilizadas como destino de la actualizacin, incluso idnticos a las dos llamadas. En particular, las condiciones de filtro o combinacin aplicadas en el res 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
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 de Table1 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. Transact-SQL 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. Transact-SQL 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 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 o image, 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 u y piense en modificar las aplicaciones que los usan actualmente. Use nvarchar(max), varchar(max) y varbina

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). 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 la columna modificada por la clusula .WRITE se hace referencia en una clusula OUTPUT, el valor completo de la columna, ya sea la imagen anterior de deleted.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 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 de BLOB subyacentes en el sistema de archivos. Cuando un campo FILESTREAM est establecido en NULL, se eliminan los datos de BLOB asociados al campo. No puede utilizar .WRITE() para realizar actualizaciones parciales de datos FILESTREAM. Para obtener ms informacin, vea FILESTREAM (SQL Server).

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. Transact-SQL 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) Transact-SQL -- 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 datosdb_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 Sintaxis bsica Limitar las filas que se actualizan

Elementos de sintaxis ofrecid UPDATE

WHERE TOP expresin de CURRENT OF

Establecer valores de columna

valores calculados operadore predeterminados subconsulta

Especificar objetos de destino que no sean tablas estndar Actualizar los datos basados en datos del resto de las tablas Actualizar las filas de una tabla remota

vistas variables de tabla alia FROM

servidor vinculado OPENQU

Actualizar tipos de datos de objetos grandes Actualizar tipos definidos por el usuario Invalidar el comportamiento predeterminado del optimizador de consultas mediante sugerencias Capturar los resultados de la instruccin UPDATE Usar UPDATE en otras instrucciones

.WRITE OPENROWSET tipos definidos por el usuario

sugerencias de tabla sugeren

Clusula OUTPUT

Procedimientos almacenados

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. Transact-SQL 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. Transact-SQL USE AdventureWorks2012; GO UPDATE Sales.SalesPerson SET Bonus = 6000, CommissionPct = .10, SalesQuota = NULL; GO

Limitar las filas que se actualizan


A.Usar la clusula WHERE

En los ejemplos de esta seccin se muestran varias formas de limitar el nmero de filas afectadas por la instruccin UPDATE. 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 tablaProduction.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. Transact-SQL USE AdventureWorks2012; 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 columnaVacationHours en 10 filas aleatorias de la tabla Employee. Transact-SQL USE AdventureWorks2012; GO UPDATE TOP (10) HumanResources.Employee SET VacationHours = VacationHours * 1.25 ; 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. Transact-SQL 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 elProductAssemblyID 800. La expresin de tabla comn devuelve una lista jerrquica de partes que se utilizan directamente para generar el ProductAssemblyID 800y las partes que se utilizan para generar esos componentes, etc. Solo se modifican las filas devueltas por la expresin de tabla comn. Transact-SQL 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;

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. Transact-SQL 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


A.Especificar un valor calculado

En los ejemplos de esta seccin se muestra la actualizacin de columnas mediante valores calculados, subconsultas y valores DEFAULT. 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. Transact-SQL 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. Transact-SQL 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. Transact-SQL USE AdventureWorks2012; GO UPDATE Production.ScrapReason SET Name += ' - tool malfunction' WHERE ScrapReasonID BETWEEN 10 and 12;

C.Especificar una subconsulta en la clusula SET


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. Transact-SQL 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 que 20.00. Transact-SQL 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. Transact-SQL 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. Transact-SQL 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. Transact-SQL 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. Transact-SQL 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 instruccin UPDATE, tal como se muestra en el siguiente ejemplo: Transact-SQL 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 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. Transact-SQL 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. Transact-SQL 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 5b982015-e19644c3-83b8-275fb9d769b2.cmp.xml (opcin de configuracin del servidor). Transact-SQL

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

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. Transact-SQL 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. Transact-SQL 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

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. Transact-SQL 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). Transact-SQL 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.

A.Usar un tipo de datos del sistema


Puede usar un UDT para suministrar 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 consult los administradores de bases de datos y los desarrolladores experimentados utilicen las sugerencias y como

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. Transact-SQL 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. Transact-SQL 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 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 un 25 por ciento de 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 columnadeleted.VacationHours y el valor actualizado en la columna inserted.VacationHours en la variable de tabla @MyTableVar. A continuacin, dos instrucciones SELECT devuelven los valores de @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). 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 empleado cada hora (SalariedFlag = 0),VacationHours se establece en el nmero actual de horas ms el valor especificado en @NewHours; por otra parte, VacationHours se establece en el valor especificado en @NewHours. Transact-SQL 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. Transact-SQL 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

El INNER JOIN
El INNER JOIN es otro tipo de composicin de tablas, permite emparejar filas de distintas tablas de forma ms eficiente que con el producto cartesiano cuando una de lascolumnas de emparejamiento est indexada. Ya que en vez de hacer el producto cartesiano completo y luego seleccionar la filas que cumplen la condicin de emparejamiento, para cada fila de una de las tablas busca directamente en la otra tabla las filas que cumplen la condicin, con lo cual se emparejan slo las filas que luego aparecen en el resultado.

La sintaxis es la siguiente:

Ejemplo: SELECT * FROM pedidos INNER JOIN clientes ON pedidos.clie = clientes.numclie tabla1 y tabla2 son especificaciones de tabla (nombre de tabla con alias o no, nombre de consulta guardada), de las tablas cuyos registros se van a combinar. Pueden ser las dos la misma tabla, en este caso es obligatorio definir al menos un alias de tabla. col1, col2 son las columnas de emparejamiento. Observar que dentro de la clusula ON los nombres de columna deben ser nombres cualificados (llevan delante el nombre de la tabla y un punto). Las columnas de emparejamiento deben contener la misma clase de datos, las dos de tipo texto, de tipo fecha etc... los campos numricos deben ser de tipos similares. Por ejemplo, se puede combinar campos AutoNumrico y Long puesto que son tipos similares, sin embargo, no se puede combinar campos de tipo Simple y Doble. Adems las columnas no pueden ser de tipo Memo ni OLE. comp representa cualquier operador de comparacin ( =, <, >, <=, >=, o <> ) y se utiliza para establecer la condicin de emparejamiento. Se pueden definir varias operadores AND y OR poniendo condiciones de emparejamiento unidas por los cada condicin entre parntesis. Ejemplo:

SELECT * FROM pedidos INNER JOIN productos ON (pedidos.fab = productos.idfab) AND (pedidos.producto = productos.idproducto) Se pueden combinar ms de dos tablas En este caso hay que sustituir en la sintaxis una tabla por un INNER JOIN completo. Por ejemplo:

SELECT * FROM (pedidos INNER JOIN clientes ON pedidos.clie = clientes.numclie) INNER JOIN empleados ON pedidos.rep = empleados.numemp En vez de tabla1 hemos escrito un INNER JOIN completo, tambin podemos escribir: SELECT * FROM clientes INNER JOIN (pedidos INNER JOIN empleados ON pedidos.rep = empleados.numemp) ON pedidos.clie = clientes.numclie En este caso hemos sustituido tabla2 por un INNER JOIN completo.

Consultas combinadas. JOINS


Consultas combinadas.
Habitualmente cuando necesitamos recuperar la informacin de una base de datos nos encontramos con que dicha informacin se encuentra repartida en varias tablas, referenciadas a travs de varios cdigos. De este modo si tuvieramos una tabla de ventas con un campo cliente, dicho campo contendra el cdigo del cliente de la tabla de cliente. Sin embargo est forma de almacenar la informacin no resulta muy util a la hora de consultar los datos. SQL nos proporciona una forma facil de mostrar la informacin repartida en varias tablas, las consultas combinadas o JOINS. Las consultas combinadas pueden ser de tres tipos: Combinacin interna Combinacin externa Uniones
[arriba]

Combinacin interna.
La combinacin interna nos permite mostrar los datos de dos o ms tablas a travs de una condicin WHERE. Si recordamos los ejemplos de los capitulos anteriores tenemos una tabla de coches, en la que tenemos referenciada la marca a travs del cdigo de marca. Para realizar la consulta combinada entre estas dos tablas debemos escribir una consulta SELECT en cuya clasula FROM escribiremos el nombre de las dos tablas, separados por comas, y una condicin WHERE que obligue a que el cdigo de marca de la tabla de coches sea igual al cdigo de la tabla de marcas. Lo ms sencillo es ver un ejemplo directamente:

SELECT tCoches.matricula, tMarcas.marca, tCoches.modelo, tCoches.color, tCoches.numero_kilometros, tCoches.num_plazas FROM tCoches, tMarcas WHERE tCoches.marca = tMarcas.codigo

La misma consulta de forma "visual" ...

Demonos cuenta que hemos antepuesto el nombre de cada tabla a el nombre del campo, esto no es obligatorio si los nombres de campos no se repiten en las tablas, pero es acondajable para evitar conflictos de nombres entre campos. Por ejemplo, si para referirnos al campo marca no anteponemos el nombre del campo la base de datos no sabe si queremos el campo marca de la tabla tCoches, que contiene el cdigo de la marca, o el campo marca de la tabla tMarcas, que contiene el nombre de la marca. Otra opcin es utilizar la clusula INNER JOIN. Su sintaxis es identica a la de una consulta SELECT habitual, con la particularidad de que n la clusula FROM slo aparece una tabla o vista, aadiendose el resto de tablas a travs de clusulas INNER JOIN .

SELECT [ALL | DISTINCT ] <nombre_campo> [{,<nombre_campo>}] FROM <nombre_tabla> [{INNER JOIN <nombre_tabla> ON <condicion_combinacion>}] [WHERE <condicion> [{ AND|OR <condicion>}]] [GROUP BY <nombre_campo> [{,<nombre_campo >}]] [HAVING <condicion>[{ AND|OR <condicion>}]] [ORDER BY <nombre_campo>|<indice_campo> [ASC | DESC] [{,<nombre_campo>|<indice_campo> [ASC | DESC ]}]]

El ejemplo anterior escrito utilizando la clausula INNER JOIN quedaria de la siguiente manera:

SELECT tCoches.matricula, tMarcas.marca, tCoches.modelo, tCoches.color, tCoches.numero_kilometros, tCoches.num_plazas FROM tCoches INNER JOIN tMarcas ON tCoches.marca = tMarcas.codigo

La clusula INNER JOIN permite separar completamente las condiciones de combinacin con otros criterios, cuando tenemos consultas que combinan nueve o diez tablas esto realmente se agradece. Sin embargo muchos programadores no son amigos de la clusula INNER JOIN, la razn es que uno de los principales gestores de bases de datos, ORACLE, no la soportaba. Si nuestro porgrama debia trabajar sobre bases de datos ORACLE no podiamos utilizar INNER JOIN. A partir de la version ORACLE 9i oracle soporta la clusula INNER JOIN.

[arriba]

Combinacin Externa
La combinacin interna es excluyente. Esto quiere decir que si un registro no cumple la condicin de combinacin no se incluye en los resultados. De este modo en el ejemplo anterior si un coche no tiene grabada la marca no se devuelve en mi consulta. Segn la naturaleza de nuestra consulta esto puede ser una ventaja , pero en otros casos significa un serio problema. Para modificar este comportamiento SQL pone a nuestra disposicin la combinacin externa. La combinacin externa no es excluyente. La sintaxis es muy parecida a la combinacin interna,

SELECT [ALL | DISTINCT ] <nombre_campo> [{,<nombre_campo>}] FROM <nombre_tabla> [{LEFT|RIGHT OUTER JOIN <nombre_tabla> ON <condicion_combinacion>}] [WHERE <condicion> [{ AND|OR <condicion>}]] [GROUP BY <nombre_campo> [{,<nombre_campo >}]] [HAVING <condicion>[{ AND|OR <condicion>}]] [ORDER BY <nombre_campo>|<indice_campo> [ASC | DESC] [{,<nombre_campo>|<indice_campo> [ASC | DESC ]}]]

La combinacin externa puede ser diestra o siniestra, LEFT OUTER JOIN o RIGHT OUTER JOIN. Con LEFT OUTER JOIN obtenemos todos los registros de en la tabla que situemos a la izquierda de la clausula JOIN, mientras que con RIGHT OUTER JOIN obtenmos el efecto contrario. Como mejor se ve la combinacin externa es con un ejemplo.

SELECT tCoches.matricula, tMarcas.marca, tCoches.modelo, tCoches.color, tCoches.numero_kilometros, tCoches.num_plazas FROM tCoches LEFT OUTER JOIN tMarcas ON tCoches.marca = tMarcas.codigo

Esta consulta devolver todos los registros de la tabla tCoches, independientemente de que tengan marca o no. En el caso de que el coche no tenga marca se devolver el valor null para los campos de la tabla tMarcas. Visualmente (la consulta devuelve los datos en azul) ...

El mismo ejemplo con RIGHT OUTER JOIN.

SELECT tCoches.matricula, tMarcas.marca, tCoches.modelo, tCoches.color, tCoches.numero_kilometros, tCoches.num_plazas FROM tCoches RIGHT OUTER JOIN tMarcas ON tCoches.marca = tMarcas.codigo

Esta consulta devolver los registros de la tabla tCoches que tengan marca relacionada y todos los registros de la tabla tMarcas, tengan algn registro en tCoches o no. Visualmente (la consulta devuelve los datos en azul) ...

[arriba]

Union
La clusula UNION permite unir dos o ms conjuntos de resultados en uno detras del otro como si se tratase de una nica tabla. De este modo podemos obtener los registros de mas de una tabla "unidos". La sintaxis corresponde a la de varias SELECT unidas a travs de UNION, como se muestra a continuacin:

SELECT [ALL | DISTINCT ]

<nombre_campo> [{,<nombre_campo>}] FROM <nombre_tabla> [{LEFT|RIGHT OUTER JOIN <nombre_tabla> ON <condicion_combinacion>}] [WHERE <condicion> [{ AND|OR <condicion>}]] [GROUP BY <nombre_campo> [{,<nombre_campo >}]] [HAVING <condicion>[{ AND|OR <condicion>}]] { UNION [ALL | DISTINCT ] SELECT [ALL | DISTINCT ] <nombre_campo> [{,<nombre_campo>}] FROM <nombre_tabla> [{LEFT|RIGHT OUTER JOIN <nombre_tabla> ON <condicion_combinacion>}] [WHERE <condicion> [{ AND|OR <condicion>}]] [GROUP BY <nombre_campo> [{,<nombre_campo >}]] [HAVING <condicion>[{ AND|OR <condicion>}]] } [ORDER BY <nombre_campo>|<indice_campo> [ASC | DESC] [{,<nombre_campo>|<indice_campo> [ASC | DESC ]}]]

Para utilizar la clausula UNION debemos cumplir una serie de normas. Las consultas a unir deben tener el mismo nmero campos, y adems los campos deben ser del mismo tipo. Slo puede haber una nica clausula ORDER BY al final de la sentencia SELECT. El siguiente ejemplo muestra el uso de UNION

SELECT tCoches.matricula, tMarcas.marca, tCoches.modelo, tCoches.color, tCoches.numero_kilometros, tCoches.num_plazas FROM tCoches INNER JOIN tMarcas ON tCoches.marca = tMarcas.codigo UNION SELECT tMotos.matricula, tMarcas.marca, tMotos.modelo, tMotos.color, tMotos.numero_kilometros, 0 FROM tMotos INNER JOIN tMarcas ON tMotos.marca = tMarcas.codigo; Puede observarse el uso de la constante cero en la segunda lista de seleccin para hacer coincidir el nmero y tipo de campos que devuelve la consulta UNION.

Leccin 15 - Reunin interna y externa (INNER / OUTER JOIN)


En la leccin anterior se trat la operacin de reunin entre tablas que guardan una relacin. Existe una sintaxis ms concreta para realizar la operacin de reunin, donde la clusula WHERE se usa nicamente para filtrar registros y no para reunir registros. Reunin interna - clusulas inner join / on Esta clusula est diseada precisamente para reunir registros de varias tablas, en ella intervienen las claves primarias y forneas, y no intervienen, o lo hacen en la clusula WHERE, los filtros propiamente dichos. Veamos una de las consultas que se expuso en la leccin anterior usando esta sintaxis. Consulta que realiza la reunin entre los profesores y los cursos que imparte cada uno usando INNER JOIN / ON:

CDIGO: SELECCIONAR TODO

select * from CURSOS C inner join PROFESORES P on C.ID_PROFE = P.ID_PROFE

llevar cdigo al banco de pruebas

Si antes se dijo que el SGBD realiza el producto cartesiano entre dos tablas y posteriormente mediante la clusula WHERE ignora aquellos registros que carecen de sentido y muestra los que guardan una relacin, ahora podemos verlo del siguiente modo: el SGBD recorrer la tabla hijo(CURSOS) y para cada uno asociar el registro de la tabla padre(PROFESORES) que satisface la clusula ON. Para asociar el profesor no es necesario realizar, para cada curso, un recorrido secuencial sobre la tabla PROFESORES hasta encontrarlo, puesto que en la clusula ON estamos indicando su clave primaria, por lo que el motor SQL usuar el ndice que la clave lleva implicito para localizar un profesor de forma mucho ms eficiente. Igual que hara usted para localizar un captulo concreto de un libro, usando el ndice.

Algunos puristas afirman que este es el modo correcto de construir las consultas, porque el motor SQL trabaja de un modo ms eficiente, a otros sin embargo les resulta incomodo o simplemente menos atractivo. Lo ideal sera que todo esto fuese transparente al desarrollador. El motor SQL debe interpretar la consulta y devolver el resultado de la forma ms eficiente, obviamente realizando productos cartesianos y posteriormente filtrando los registros no es un mtodo eficiente, pero esto es algo que consideramos en este curso como herramienta de aprendizaje o mtodo de comprensin, y que en realidad los SGBD no hacen a no ser que no les quede ms remedio, ya sea porque se lo pidamos explcitamente omitiendo la clusula WHERE, no se hayan establecido las relaciones, o sean poco "inteligentes". Dicho de otro modo, yo espero de un SGBD que sea eficaz no solo al ejecutar la consulta, sino al interpretarla y al elaborar un plan de ejecucin adecuado y eficaz, y poder usar la sintaxis que ms cmoda me resulte, sin tener que pensar si la consulta es costosa o no para el motor SQL. Desafortunadamente no siempre se podr pasar esto por alto, en ocasiones se deber optimizar la consulta para ayudar al SGBD a ser ms eficiente. En cualquier caso la optimizacin queda fuera del alcance de este curso. Por ahora basta con que usted sepa que es importante crear las claves primarias y forneas debidamente, tanto por una cuestin de eficiencia como de integridad referencial. Veamos otro ejemplo de la leccin anterior usando esta clusula, concretamente del apartado de ejercicios, donde se peda los cursos en que se ha matriculado el alumno con identificador 1:
CDIGO: SELECCIONAR TODO

select C.TITULO CURSO from ALUMNOS_CURSOS AC inner join CURSOS C on AC.ID_CURSO = C.ID_CURSO where AC.ID_ALUMNO = 1

llevar cdigo al banco de pruebas

Observe como en la clusula WHERE se establece un filtro propiamente dicho, y en la clusula ON se establece la condicin de reunin que el motor debe aplicar entre las tablas a ambos lados de la clusula INNER JOIN. Veamos un ltimo ejemplo de reunin interna en la que aparezcan tres tablas, para ello tomemos otro ejemplo de la leccin anterior, la reunin de los alumnos con los cursos que cursa cada uno.

Tomando ejemplos equivalentes construidos nicamente con la clusula WHERE se pueden observar mejor las diferencias.

CDIGO: SELECCIONAR TODO

select C.TITULO CURSO , concat(A.APELLIDOS,', ',A.NOMBRE ) ALUMNO from ALUMNOS_CURSOS AC inner join ALUMNOS A on AC.ID_ALUMNO = A.ID_ALUMNO inner join CURSOS C on AC.ID_CURSO = C.ID_CURSO

order by C.TITULO , A.NOMBRE , A.APELLIDOS

llevar cdigo al banco de pruebas

Si ahora sobre este consulta se quisiera reducir el resultado a un curso o un alumno en concreto, se aadira la pertinente clusula WHERE con el filtro deseado justo antes de la clusula ORDER BY. ***

Reunin externa - left outer join / right outer join La reunin externa puede verse en este caso como una reunin interna donde no es necesario que el registro hijo tenga informada la clave fornea para ser mostrado, por ejemplo, cuando se mostraban los cursos junto a los profesores que los imparten, como uno de los cursos no tiene padre, es decir, no tiene un profesor asignado, o lo que es lo mismo, el campo ID_PROFE de la tabla CURSOS est a nulo, este curso no se muestra dado que no satisface la clusula ON. Bien, este recurso nos ofrece la posibilidad de mostrar estos registros con los campos del registro padre a nulo. La reunin externa siempre se realizaran por la izquierda o por la derecha, una de las dos. De este modo expresamos el deseo de considerar todos los registros de la tabla a la izquierda o a la derecha de la clusula OUTER JOIN, aunque no se hallen coincidencias con la otra tabla segn la clusula ON. Veamos la consulta que muestra los cursos y sus profesores aunque el curso no tenga profesor asignado:

CDIGO: SELECCIONAR TODO

select * from CURSOS C left outer join PROFESORES P on C.ID_PROFE = P.ID_PROFE

llevar cdigo al banco de pruebas

Como en este caso usamos LEFT OUTER JOIN, la tabla que de la izquierda, es decir, la tabla CURSOS, ser considerada por completo aunque no tenga xito la clusula ON, en cuyo caso los campos de la tabla situada a la derecha de la clusula se mostrarn a nulo. Si invertimos el orden de las tablas y usamos RIGHT OUTER JOIN, o simplemente RIGHT JOIN, expresin equivalente simplificada aplicable tambin a LEFT JOIN, el resultado es el mismo.

CDIGO: SELECCIONAR TODO

select * from PROFESORES P right join CURSOS C on C.ID_PROFE = P.ID_PROFE

llevar cdigo al banco de pruebas

En la consulta anterior se estn considerando todos los cursos aunque estos no tengan un profesor definido, si ahora usted quisiera obtener esto mismo pero aadiendo un filtro sobre la tabla PROFESORES, por ejemplo que el apellido del profesor contenga una "E", cabe esperar hacerlo en la clusula WHERE, sin embargo tambin es posible aplicar el filtro en la clusula ON. En realidad elegiremos una u otra clusula en funcin de lo que deseemos obtener. Si lo hacemos en la clausula ON de un OUTER JOIN se estarn obteniendo todos los cursos con los campos de la tabla PROFESORES a nulo si la condicion establecida en la clusula ON no tiene xito. Si se hace en la clusula WHERE se estar forzando a que se cumpla dicha clusula y por tanto la reunin externa se rompe. Veamos esto con un ejemplo: Consulta que muestra todos los cursos acompaados del profesor que lo imparte. Si el curso no tiene profesro definido o bien el campo APELLIDOS no contiene una "E", los campos de la tabla PROFESORES se mostrarn a nulo:

CDIGO: SELECCIONAR TODO

select * from PROFESORES P right join CURSOS C on C.ID_PROFE = P.ID_PROFE and P.APELLIDOS like '%E%'

llevar cdigo al banco de pruebas

El resultado presenta para el curso 3 los campos de la tabla PROFESORES a nulo porque el campo APELLIDOS del profesor que lo imparte no contiene un "E". Para el curso 5 ocurre lo mismo pero en este caso el motivo es adems que no tiene profesor definido, con que mucho menos podr ser cierta la otra condicin. Ahora aplicamos el filtro del apellido en la clusula WHERE:

CDIGO: SELECCIONAR TODO

select * from PROFESORES P right join CURSOS C on C.ID_PROFE = P.ID_PROFE where P.APELLIDOS like '%E%'

llevar cdigo al banco de pruebas

Observamos como la reunin externa se rompe puesto que la clusula WHERE exige que el apellido del profesor contenga una "E", dado que los cursos que no tienen profesor definido la consulta devuelve el apellido a nulo, esta clusula no se satisface por lo que oculta el registro y la reunin externa carece de sentido, o si usted quiere, la clausula WHERE es aplicable a la tabla CURSOS pero no a la tabla PROFESORES, puesto que en este caso no tiene sentido realizar una reunin externa para que luego un filtro en la clusula WHERE la anule. ***

Vamos ahora a ver los recuentos sobre reuniones externas, por ejemplo los alumnos que hay matriculados en cada curso. Esta consulta se present en la leccin anterior, en el apartado de ejercicios, sin embargo los cursos sin alumnos matriculados eran ignorados en lugar de aparecer con un cero como sera de esperar. Esto es debido a que no satisfacen la clausula ON de una reunin interna, por lo que se debe usar la reunin externa para este propsito, pero cuidado, ahora no nos sirve el recuento de registros, puesto que pueden venir cursos sin alumnos, o lo que es lo mismo, cursos con los datos del alumno a nulo, de modo que si contamos registros los datos no sern verdicos, deben contarse alumnos. Revise si lo cree conveniente la leccin 10donde se trataron las particularidades del valor NULO. Alumnos matriculados en cada curso, aunque estos sean cero:

CDIGO: SELECCIONAR TODO

select C.TITULO CURSO, count(AC.ID_ALUMNO) ALUMNOS, count(1) REGISTROS from ALUMNOS_CURSOS AC right join CURSOS C on AC.ID_CURSO = C.ID_CURSO group by C.TITULO

llevar cdigo al banco de pruebas

En la anterior consulta se han contado tanto alumnos como registros para poder observar la diferencia. La nica fila en que estos dos valores difieren es para el curso de SQL avanzado. Dado que la reunin externa devuelve la fila con los datos del alumno a nulo para los cursos sin alumnos, al realizar un recuento de registros el valor es uno, el registro existe, pero al realizar el recuento del campo ID_ALUMNO este es ignorado por la funcin COUNT por ser nulo. Observe que en este caso la tabla que interesa tratar por completo mostrando todos sus registros es la tabla padre(CURSOS), y la tabla donde no importa que halla aciertos es la tabla hijos(ALUMNOS_CURSOS). Es decir, la consulta devuelve todos los registros de la tabla CURSOS aunque para ellos no existan hijos en la tabla ALUMNOS_CURSOS. En los ejemplos anteriores a este ltimo, tambin interesaba tratar por completo la tabla CURSOS, pero esta ejerca de hijo y no de padre, y los campos de la tabla PROFESORES podan venir a nulo no porque no existiera el registro en la tabla PROFESORES que tambin, sino como consecuencia de que el campo ID_PROFE de la tabla CURSOS contena un valor nulo.

***

Por ltimo comentar que la reunin externa no es posible hacerla usando nicamente la clusula WHERE, debemos forzosamente usar la clusula OUTER JOIN. Esto es as en MySQL, sin embargo en Oracle, que originalmente solo se podan construir consultas con las sintaxis basada en clusula WHERE, si es posible realizar reuniones externas con esta sintaxis, para ello indicamos el smbolo"(+)" tras los campos de la clausula WHERE pertenecientes a la tabla que devolver los campos a nulo en el caso de no cumplirse la condicin, por ejemplo la consulta anterior en Oracle se construira de la siguiente manera. Consulta Oracle:

CDIGO: SELECCIONAR TODO

select C.TITULO CURSO, count(AC.ID_ALUMNO) ALUMNOS, count(1) REGISTROS from ALUMNOS_CURSOS AC ,CURSOS C where AC.ID_CURSO(+) = C.ID_CURSO group by C.TITULO

Con ello estamos indicando el SGBD Oracle que aunque no encuentre el registro en la tabla ALUMNOS_CURSOS, devuelva el registro de la tabla CURSOS con los datos de la tabla ALUMNOS_CURSOS a nulo, es decir, se esta realizando una reunin externa. Por ejemplo, en la consulta en la que se devolva todos los cursos con el profesor que imparte cada curso y ademas incluamos el filtro de que el apellido del profesor tuviese una "E" se construira de la siguiente manera en Oracle: Consulta Oracle:

CDIGO: SELECCIONAR TODO

select * from PROFESORES P , CURSOS C where C.ID_PROFE = P.ID_PROFE(+) and P.APELLIDOS(+) like '%E%'

En general en una reunin externa debemos tratar siempre la tabla cuyos campos pueden venir a

nulo, si es en Oracle, aunque actualmente es posible usar la sintaxis OUTER JOIN, pondremos el smbolo "(+)" a cada campo de dicha tabla que aparezca en la clusula WHERE. Si usamos OUTER JOIN, pondremos todos los campos que establecen condiciones de dicha tabla en la clusula ON, si lo hacemos en la clusula WHERE como filtro corriente la reunin externa se rompe y carece de sentido. *** Resumen La reunin interna permite reunir registros de tablas relacionadas ignorando los registros que no satisfacen la condicin de reunin especificada en la clusula WHERE o bien en la clusula ON en el caso de usar la sintaxis INNER JOIN. La reunin externa permite reunir registros de tablas relacionadas considerando todos los registros de una primera tablas aunque ninguno de los registros de una segunda tabla presente aciertos contra la primera, obviamente en ese caso los campos de esta ltima tabla vendrn a nulo. Existen dos sintaxis para realizar las operaciones de reunin ya sea externa o interna, dependiendo del SGBD. Basada en clusula WHERE o bien basada en clusula INNER JOIN / OUTER JOIN. Lo ideal sera dejar a criterio del desarrollador el uso de cualquiera de ellas siempre y cuando el SGBD lo soporte. En una reunin externa debemos tratar siempre la tabla cuyos campos pueden venir a nulo poniendo todos los campos que establecen condiciones de dicha tabla en la clusula ON del OUTER JOIN, si lo hacemos en la clusula WHERE como filtro corriente la reunin externa se rompe y carece de sentido. *** Ejercicio 1 Construya una consula que resuelva el nmero de cursos que imparte cada profesor usando la clusula INNER JOIN. Ejercicio 2 Realice una consulta entre las tablas CURSOS, ALUMNOS y ALUMNOS_CURSOS de modo que aparezcan los alumnos matriculados en cada curso pero mostrando todos los cursos aunque no tengan alumnos matriculados.

SQL WHERE Clause


Previous Next Chapter

The WHERE clause is used to filter records.

The SQL WHERE Clause


The WHERE clause is used to extract only those records that fulfill a specified criterion.

SQL WHERE Syntax


SELECT column_name,column_name FROM table_name WHERE column_name operator value;

Demo Database
In this tutorial we will use the well-known Northwind sample database. Below is a selection from the "Customers" table:
CustomerID CustomerName ContactName Address City

Posta

1 2

Alfreds Futterkiste Ana Trujillo Emparedados y helados Antonio Moreno Taquera

Maria Anders Ana Trujillo

Obere Str. 57 Avda. de la Constitucin 2222 Mataderos 2312

Berlin Mxico D.F. Mxico D.F. London

1220

0502

Antonio Moreno

0502

Around the Horn

Thomas Hardy

120 Hanover Sq.

WA1

Berglunds snabbkp

Christina Berglund

Berguvsvgen 8

Lule

S-95

WHERE Clause Example


The following SQL statement selects all the customers from the country "Mexico", in the "Customers" table:

Example SELECT * FROM Customers WHERE Country='Mexico';

Try it yourself

Text Fields vs. Numeric Fields


SQL requires single quotes around text values (most database systems will also allow double quotes). However, numeric fields should not be enclosed in quotes:

Example SELECT * FROM Customers WHERE CustomerID=1;

Try it yourself

Operators in The WHERE Clause


The following operators can be used in the WHERE clause:

Operator

Description

= <> > < >= <= BETWEEN LIKE IN

Equal Not equal. Note: In some versions of SQL this operator may be written as != Greater than Less than Greater than or equal Less than or equal Between an inclusive range Search for a pattern To specify multiple possible values for a column

Leccin 5 - Operadores (SQL WHERE)


Un operador, como su propio nombre indica, es quien opera, normalmente entre dos operandos, estableciendo una operacin que al ejecutarla se obtiene un resultado. Por ejemplo en matemticas: 3 + 4 "+" es el operador y, "3" y "4" son los operandos. el resultado de esta operacin es 7.

A modo de apunte diremos, aunque poco tenga que ver con esta leccin, que el SQL nos permite calcular ciertas operaciones matemticas tanto en la clausula SELECT, para obtener resultados, como en la clusula WHERE, para establecer condiciones:

CDIGO: SELECCIONAR TODO

select 3 + 4

llevar cdigo al banco de pruebas

A la pregunta: Qu empleados tienen un salario mayor de 1350?, podramos construir la consulta SQL as, sustituyendo 1350 por: 1300 + 50.

CDIGO: SELECCIONAR TODO

select NOMBRE , APELLIDOS from EMPLEADOS where SALARIO > 1300 + 50

llevar cdigo al banco de pruebas

Lgica booleana Lo que se pretende abordar en esta leccin principalmente es la lgica booleana, que es la que

nos permite establecer condiciones. Advierto que esta leccin puede resultar un poco dura, si tiene dificultades para entender lo que trataremos, no se preocupe e intente quedarse con la idea de fondo. Cuando usted jugaba al ya clsico juego de quin es quin?,

usted estaba aplicando lgica booleana para descubrir el personaje que su contrincante esconda. Usted lanzaba preguntas con el propsito de saber si una caracterstica del personaje misterioso era cierta o falsa, y si era cierta, descartaba los personajes que no presentaban esa caracterstica. El SGBD hace algo muy parecido, usted establece una caracterstica en la clausula WHERE de la consulta SQL, y el SGBD descarta los registros en que la caracterstica es falsa, mientras que mantiene los que es cierta. Expresiones booleanas Si usted jugando a Quin es quin? preguntaba a su contrincante: tiene barba?, lo que en realidad estaba preguntando era: EL PERSONAJE MISTERIOSO tiene BARBA? pues bien, esto es una expresin booleana donde: "tiene" es el operador, "EL PERSONAJE MISTERIOSO" es un operando variable, que depende del personaje elegido por su contrincante, y "BARBA" es un operando constante. El resultado de aplicar esta expresin a un personaje concreto dar cierto si el personaje tiene barba, y falso en caso contrario. Cuando en la primera consulta de este cuso:

CDIGO: SELECCIONAR TODO

select NOMBRE , APELLIDOS from EMPLEADOS where SALARIO > 1350

llevar cdigo al banco de pruebas

indicbamos en la clausula WHERE: SALARIO > 1350(es SALARIO mayor a 1350?), estbamos estableciendo una expresin booleana donde: ">" es el operador, "SALARIO" es un operando variable, que tomar valores de cada registro de la tabla EMPLEADOS, y "1350" es un operando constante. El resultado de esta expresin depende del valor que tome la variable SALARIO, pero en cualquier caso slo puede dar dos posibles resultados, o cierto o falso. Por lo tanto diremos que una expresin booleana slo tiene dos posibles resultados. El motor SQL evala la expresin booleana de la clausula WHERE para cada registro de la tabla, y el resultado determina si el registro que se est tratando se tomar en consideracin. Lo har si el resultado de evaluar la expresin es cierto, y lo ignorar si el resultado es falso. Ejemplo de expresiones booleanas: "4 > 3" : es cuatro mayor que tres? "3 = 12" : es tres igual a doce?

Fjese que los operandos son del mismo tipo, en este caso tipo INT. Sin embargo el resultado obtenido no es un dato de tipo INT, sino booleano, sus posibles valores son cierto o falso. (4 > 3) = cierto (3 = 12) = falso

Operadores Algunos de los operadores que nos permiten construir expresiones booleanas son: > : "A > B" devuelve cierto si A es estrictamente mayor que B, de lo contrario devuelve falso. < : "A < B" devuelve cierto si A es estrictamente menor que B, de lo contrario devuelve falso. = : "A = B" devuelve cierto si A es igual a B, de lo contrario devuelve falso.

>= : "A >= B" devuelve cierto si A es mayor o igual a B, de lo contrario devuelve falso. <= : "A <= B" devuelve cierto si A es menor o igual a B, de lo contrario devuelve falso. != : "A != B" devuelve cierto si A es distinto a B, de lo contrario devuelve falso.

Al construir expresiones con estos operadores, los dos operandos deben ser del mismo tipo, ya sean nmeros, cadenas o fechas. Ejemplo de expresin booleana con cadenas: ('Aranda, Pedro' < 'Zapata, Mario' ) = cierto, puesto que por orden alfabtico 'Aranda, Pedro' est posicionado antes que 'Zapata, Mario' , por lo tanto es menor el primero que el segundo. Operadores lgicos Los operadores lgicos permiten formar expresiones booleanas tomando como operandos otras expresiones booleanas. Fjese que en las expresiones vistas anteriormente, los operandos deban ser nmeros, cadenas o fechas, ahora sin embargo los operandos deben ser expresiones booleanas, el conjunto forma una nueva expresin booleana que, como toda expresin booleana, dar como resultado cierto o falso. AND : "A and B" devuelve cierto si A y B valen cierto, y falso en cualquier otro caso. OR : "A or B" devuelve cierto si A o B valen cierto, y falso nicamente cuando tanto A como B valen falso. NOT : "not A" devuelve falso si A vale cierto, y cierto si A vale falso.

Veamos una aplicacin en el mundo cotidiano. Supongamos el siguiente anunciado: Mi jefe quiere contratar a una persona para repartir genero, solamente pueden optar a la vacante aquellos candidatos que tengan vehculo propio y licencia de conducir automviles. Como candidatos tenemos a ngela, que tiene licencia pero no tiene vehculo. A Salva, que tiene licencia y vehculo. Y a Teresa, que tiene vehculo pero de momento no tiene licencia. Quines pueden pasar al proceso de seleccin? Convertimos el anunciado en una expresin booleana: Sea C: pasa al proceso de seleccin. Sea A: tiene vehculo propio. Sea B: tiene licencia de conducir automviles.

Entonces para que un candidato satisfaga C, se debe dar A y B: C = A and B Resolvamos la expresin para cada candidato: Aplicado a ngela: C = (A and B) = (falso and cierto) = falso. Luego no pasa al proceso de seleccin. Aplicado a Salva: C = (A and B) = (cierto and cierto) = cierto. Luego pasa al proceso de seleccin. Aplicado a Teresa: C = (A and B) = (cierto and falso) = falso. Luego no pasa al proceso de seleccin. Veamos ahora esto mismo aplicado al SQL: Consideremos ahora la tabla PERSONAS, donde hemos guardado una "S" en el campo RUBIA si la persona es rubia y una "N" en caso contrario, anlogamente se ha aplicado el mismo criterio para ALTA y GAFAS, es decir, para indicar si es alta y si lleva gafas.

El operador AND Como ya hemos dicho el operador AND devuelve cierto si ambas expresiones son ciertas, y falso en cualquier otro caso. Supongamos que queremos saber qu personas son rubias y altas?, para ello construimos la siguiente consulta SQL:

CDIGO: SELECCIONAR TODO

select NOMBRE from PERSONAS where (RUBIA = 'S') and (ALTA = 'S')

llevar cdigo al banco de pruebas

Resultado: Evaluar (RUBIA = 'S') da como resultado cierto o falso, al igual que evaluar (ALTA = 'S'), son de echo los dos operandos booleanos del operador AND. Si para un registro ambos son ciertos el

resultado es cierto, y se mostrarn los datos de ese registro que indica la clausula SELECT. En el caso de tener una expresin de la forma: "A and B and D" la expresin se evala por partes por orden de aparicin: primero se evala (A and B) = E y finalmente (E and D) Si todos los operadores de la expresin son AND, entonces todos las expresiones deben valer cierto para que el resultado sea cierto. Veamos un ejemplo de esto mientras jugamos a Quin es quin? Usted pregunta: es rubia? y la respuesta es cierto es alta? y la respuesta es falso lleva gafas? y la respuesta es cierto Por lo tanto debe ser una persona que sea rubia y, no sea alta y, lleve gafas. Quin es el personaje?
CDIGO: SELECCIONAR TODO

select NOMBRE from PERSONAS where (RUBIA = 'S') and (ALTA = 'N') and (GAFAS='S')

llevar cdigo al banco de pruebas

Resultado:

Antes de dejar el operador AND, recordar del modo equivalente y ms simplificado que se coment en la leccin 3 en que podemos condicionar un campo a un rango de valores mediante el operador BETWEEN:

CDIGO: SELECCIONAR TODO

where SALARIO >= 1300 and SALARIO <=1500

que el salario sea mayor o igual a 1300 y menor o igual a 1500 forma equivalente:
CDIGO: SELECCIONAR TODO

where SALARIO between 1300 and 1500

que el salario este entre 1300 y 1500 El operador OR Con el operador OR basta que uno de los dos operandos sea cierto para que el resultado sea cierto: Supongamos que queremos saber las personas que son rubias o bien altas, es decir, queremos que si es rubia la considere con independencia de su altura, y a la inversa, tambin queremos que la seleccione si es alta independientemente del color de pelo. La consulta sera la siguiente.

CDIGO: SELECCIONAR TODO

select NOMBRE from PERSONAS where (RUBIA = 'S') or (ALTA = 'S')

llevar cdigo al banco de pruebas

Resultado: Si todos los operadores de la expresin son OR, por ejemplo "A or B or C", entonces todos las expresiones deben valer falso para que el resultado sea falso, con que solo una valga cierto el resultado es cierto. Supongamos que quiere seleccionar tres registros concretos de la tabla EMPLEADOS para ver sus datos, le interesan los registros con identificador 1, 2 y 4. Para esta situacin debe usar el

operador OR, puesto que su consulta debe establecer la condicin: que el identificador sea 1, 2 o 4:

CDIGO: SELECCIONAR TODO

select * from EMPLEADOS where ID_EMPLEADO = 1 or ID_EMPLEADO = 2 or ID_EMPLEADO = 4

llevar cdigo al banco de pruebas

Resultado:

El asterisco presente en la clusula SELECT equivale a indicar todos los campos de la tabla.

Fjese como en la anterior consulta para cualquier registro de la tabla EMPLEADOS que el campo ID_EMPLEADO contenga un valor distinto a 1, 2 o 4, el resultado de evaluar la expresin ser falso, puesto que todos las expresiones booleanas darn falso, pero con que una de ellas valga cierto, el registro sera seleccionado. De hecho si un mismo campo aparece dos o ms veces en expresiones de la clusula WHERE como en el ejemplo anterior, carece de sentido que el operador sea AND: usted puede esperar que una persona sea rubia o morena, pero no puede esperar que sea rubia y morena. Del mismo modo el identificador de un registro nunca podr ser 1 y 2, o es 1 o es 2 o es x. Un modo de simplificar la anterior consulta es mediante la palabra clave IN, donde se establece una lista de valores posibles que debe contener el campo indicado para que el registro sea seleccionado. La palabra clave IN equivale a establecer condiciones sobre un mismo campo conectadas por el operador OR.

CDIGO: SELECCIONAR TODO

select * from EMPLEADOS where ID_EMPLEADO in (1,2,4)

llevar cdigo al banco de pruebas

Resultado:

El operador NOT Este operador tan solo tiene un operando, el resultado es negar el valor del operando de modo que: "(4 > 3) = cierto" luego "not (4>3) = falso" Si negamos dos veces una expresin booleana es equivalente a la expresin original: "(4 > 3) = cierto" luego "not ( not (4>3) ) = cierto" Cuando descubrimos al personaje misterioso, a la pregunta es alta? la respuesta era falso, luego podramos haber establecido lo siguiente: "not (ALTA = 'S')" en lugar de "(ALTA = 'N')":
CDIGO: SELECCIONAR TODO

select NOMBRE from PERSONAS where (RUBIA = 'S') and not (ALTA = 'S') and (GAFAS='S')

llevar cdigo al banco de pruebas

Resultado:

Otro ejemplo: si negamos toda la expresin de la clausula WHERE, estaremos precisamente seleccionando los registros que antes descartbamos, y al revs, descartando los que antes seleccionbamos. Tomemos la anterior consulta y neguemos la clausula WHERE, si antes el resultado era: Carmen, ahora el resultado ha de ser todas las persona menos Carmen. Para hacer esto cerramos entre

parntesis toda la expresin y le colocamos el operador "not" delante, de ese modo primero se resolver lo que esta dentro de los parntesis y finalmente se negar el resultado.

CDIGO: SELECCIONAR TODO

select NOMBRE from PERSONAS where not ((RUBIA = 'S') and not(ALTA = 'S') and (GAFAS= 'S'))

llevar cdigo al banco de pruebas

Efectivamente el resultado es justo lo contrario que antes:

Y aun otro ejemplo de este operador junto la palabra clave IN: tomemos la consulta que seleccionaba tres registros concretos de la tabla EMPLEADOS, y modifiqumosla nicamente incluyendo el operador NOT para que devuelva lo contrario, es decir, todos los registros menos los tres que antes seleccionaba:

CDIGO: SELECCIONAR TODO

select * from EMPLEADOS where ID_EMPLEADO not in (1,2,4)

llevar cdigo al banco de pruebas

Resultado:

El uso de parntesis Los parntesis se comportan como en matemticas, no es lo mismo "5 + 4 / 3" donde primero se calcular la divisin y despus se sumar 5, que "(5 + 4) / 3" donde primero se resolver la suma y el resultado parcial se dividir por 3. Sin parntesis la divisin tiene prioridad sobre la suma, con parntesis forzamos a que la operacin se realice en el orden deseado. Los operadores AND y OR tienen la misma prioridad de modo que se evala la expresin por orden

de aparicin: No es lo mismo: "RUBIA and ALTA or GAFAS" = "(RUBIA and ALTA) or GAFAS" que, "RUBIA and (ALTA or GAFAS)". En primer caso estamos diciendo: "que sea rubia y alta, o bien lleve gafas", y en el segundo "que sea rubia y, sea alta o lleve gafas".

CDIGO: SELECCIONAR TODO

select NOMBRE from PERSONAS where RUBIA = 'S' and ALTA = 'S' or GAFAS= 'S'

llevar cdigo al banco de pruebas

Resultado:

CDIGO: SELECCIONAR TODO

select NOMBRE from PERSONAS where RUBIA = 'S' and (ALTA = 'S' or GAFAS= 'S')

llevar cdigo al banco de pruebas

Resultado:

*** Resumen En esta leccin se ha descrito como construir expresiones booleanas y como trabajar con ellas para establecer condiciones en la clausula WHERE de una consulta SQL. Las expresiones booleanas con operadores tales como ( > , = , != ...) precisan operandos de tipo nmero, cadena o fecha, y el resultado de evaluar la expresin devuelve siempre cierto o falso. Ejemplo: (SALARIO > 1350)

Las expresiones con operadores tales como (AND , OR , NOT) precisan expresiones booleanas como operandos, el conjunto es una nueva expresin booleana que al evaluarla devolver siempre cierto o falso. Ejemplo: RUBIA = 'S' and ALTA = 'S' El uso de parntesis garantiza que, en una expresin compleja las expresiones simples que la forman se evalen en el orden que usted desea. Ejemplo: not ( (RUBIA = 'S' or ALTA = 'S') and (ALTA ='N' or GAFAS = 'S') ) *** Ejercicio 1 Cree una consulta SQL que devuelva las personas que son altas, o bien son rubias con gafas. Ejercicio 2 Cree una consulta SQL que devuelva los empleados que son mujer y cobran ms de 1300 euros.

En la tabla empleados se guarda una "H" en el campo SEXO para indicar que es hombre, o una "M" para indicar que es mujer.

Ejercicio 3 Usando solo expresiones (ALTA = 'S') , (RUBIA = 'S') , (GAFAS = 'S') combinadas con el operador NOT resuelva: Quin es quin? Lleva gafas y no es alta ni rubia. Ejercicio 4 (optativo) Suponiendo que A vale cierto y B vale falso, evale la siguiente expresin booleana: C= ((A and B) and (A or (A or B))) or A

You might also like