Sunteți pe pagina 1din 100

Mi coleccin

Este documento se proporciona "tal cual". La informacin y los puntos de vista expresados en este documento, incluyendo las referencias a sitios web de
Internet y direcciones URL, est sujeta a cambios sin aviso. Este documento no implica ningn derecho legal respecto a ninguna propiedad intelectual de ningn
nombre de producto o producto de Microsoft. Puede copiar y utilizar este documento con fines internos y de referencia. Se permite que modifique este
documento para sus fines internos y de referencia. 2013 Microsoft. Reservados todos los derechos. Trminos de uso
(http://msdn.microsoft.com/cc300389.aspx) | Marcas comerciales (http://www.microsoft.com/library/toolbar/3.0/trademarks/en-us.mspx)
Table Of Contents
Captulo 1
BULK INSERT (Transact-SQL)
DELETE (Transact-SQL)
FROM (Transact-SQL)
Sugerencias (Transact-SQL)
INSERT (Transact-SQL)
MERGE (Transact-SQL)
OPTION clusula de TransactSQL
OUTPUT clusula de TransactSQL
READTEXT (Transact-SQL)
Condiciones de bsqueda TransactSQL
SELECT (Transact-SQL)
Constructor con valores de tabla (Transact-SQL)
TOP (Transact-SQL)
UPDATE (Transact-SQL)
UPDATETEXT (Transact-SQL)
WHERE (Transact-SQL)
WITH common_table_expression (Transact-SQL)
WRITETEXT (Transact-SQL)
Captulo1
BULK INSERT (Transact-SQL)
Importa un archivo de datos en una tabla o vista de base de datos con un formato especificado por el usuario en SQL Server
Se aplica a: SQL Server (desde SQL Server 2008 hasta la versin actual).
Convenciones de sintaxis de Transact-SQL (Transact-SQL)
Sintaxis
Argumentos
database_name
Es el nombre de la base de datos en la que reside la tabla o vista especificada. Si no se especifica, es la base de datos actual.
schema_name
Es el nombre del esquema de la tabla o vista. schema_name es opcional si el esquema predeterminado para el usuario que realiza la operacin de importacin
masiva es el esquema de la tabla o vista especificada. Si no se especifica schema y el esquema predeterminado del usuario que realiza la operacin de
importacin masiva es diferente de la tabla o vista especificada, SQL Server devuelve un mensaje de error y se cancela la operacin de importacin masiva.
table_name
Es el nombre de la tabla o vista en la que se va a realizar una importacin masiva de datos. Solo se pueden utilizar vistas en las que todas las columnas hagan
referencia a la misma tabla base. Para obtener ms informacin acerca de las restricciones para la carga de datos en vistas, vea INSERT (Transact-SQL).
' data_file '
Es la ruta de acceso completa al archivo de datos que contiene los datos que se van a importar en la tabla o vista especificada. BULK INSERT puede importar
datos desde un disco incluidos una ubicacin de red, disquete, disco duro, etc..
data_filedebe especificar una ruta de acceso vlida del servidor en el que se ejecuta SQL Server. Si data_file es un archivo remoto, especifique un nombre UNC
Convencin de nomenclatura universal. Un nombre UNC tiene el formato \\Systemname\ShareName\Path\FileName. Por ejemplo,
\ \ Syst emX\ Di skZ\ Sal es\ updat e. t xt .
BATCHSIZE =batch_size
Especifica el nmero de filas de un lote. Cada lote se copia en el servidor como una transaccin. Si no ocurre as, SQL Server confirma o revierte la transaccin
de cada lote. De forma predeterminada, todos los datos del archivo de datos especificado componen un lote. Para obtener informacin acerca de
consideraciones de rendimiento, vea la seccin "Comentarios" ms adelante en este tema.
CHECK_CONSTRAINTS
Especifica que deben comprobarse todas las restricciones de la tabla o vista de destino durante la operacin de importacin masiva. Sin la opcin
CHECK_CONSTRAINTS, se omiten las restricciones CHECK y FOREIGN KEY, y, despus de la operacin, la restriccin sobre la tabla se marca como de no
confianza.
Nota
Las restricciones UNIQUE y PRIMARY KEY se aplican siempre. Cuando se importa en una columna de caracteres definida con la restriccin NOT NULL, BULK
INSERT inserta una cadena vaca cuando no hay valor en el archivo de texto.
En algn momento, debe examinar las restricciones de toda la tabla. Si la tabla no estaba vaca antes de la operacin de importacin masiva, el costo de
revalidar la restriccin puede superar del costo de aplicar restricciones CHECK a los datos incrementales.
SQL Server 2014
BULK I NSERT
[ dat abase_name . [ schema_name ] . | schema_name . ] [ t abl e_name | vi ew_name ]
FROM' dat a_f i l e'
[ WI TH
(
[ [ , ] BATCHSI ZE =bat ch_si ze ]
[ [ , ] CHECK_CONSTRAI NTS ]
[ [ , ] CODEPAGE ={ ' ACP' | ' OEM' | ' RAW' | ' code_page' } ]
[ [ , ] DATAFI LETYPE =
{ ' char ' | ' nat i ve' | ' wi dechar ' | ' wi denat i ve' } ]
[ [ , ] FI ELDTERMI NATOR =' f i el d_t er mi nat or ' ]
[ [ , ] FI RSTROW=f i r st _r ow ]
[ [ , ] FI RE_TRI GGERS ]
[ [ , ] FORMATFI LE =' f or mat _f i l e_pat h' ]
[ [ , ] KEEPI DENTI TY ]
[ [ , ] KEEPNULLS ]
[ [ , ] KI LOBYTES_PER_BATCH =ki l obyt es_per _bat ch ]
[ [ , ] LASTROW=l ast _r ow ]
[ [ , ] MAXERRORS =max_er r or s ]
[ [ , ] ORDER ( { col umn [ ASC | DESC ] } [ , . . . n ] ) ]
[ [ , ] ROWS_PER_BATCH =r ows_per _bat ch ]
[ [ , ] ROWTERMI NATOR =' r ow_t er mi nat or ' ]
[ [ , ] TABLOCK ]
[ [ , ] ERRORFI LE =' f i l e_name' ]
) ]
Una situacin en la que quiz desee que las restricciones estn deshabilitadas comportamiento predeterminado se produce cuando los datos de entrada
contienen filas que infringen las restricciones. Con las restricciones CHECK deshabilitadas, puede importar los datos y utilizar despus instrucciones TransactSQL
para quitar los datos no vlidos.
Nota
La opcin MAXERRORS no se aplica a la comprobacin de restricciones.
CODEPAGE = {'ACP' | 'OEM' | 'RAW' | 'code_page' }
Especifica la pgina de cdigos de los datos incluidos en el archivo de datos. CODEPAGE solo es pertinente si los datos contienen columnas de tipo char,
varchar o text con valores de caracteres mayores que 127 o menores que 32.
Nota
Microsoft recomienda especificar un nombre de intercalacin para cada columna de un archivo de formato.
Valor de CODEPAGE Descripcin
ACP Las columnas con el tipo de datos char, varchar o text se convierten de la pgina de cdigos ANSI/Microsoft Windows ISO 1252 a
la pgina de cdigos de SQL Server.
OEM (valor
predeterminado)
Las columnas con los tipos de datos char, varchar o text se convierten de la pgina de cdigos OEM del sistema a la pgina de
cdigos de SQL Server.
RAW No se realiza ninguna conversin de una pgina de cdigos a otra; se trata de la opcin ms rpida.
code_page Nmero especfico de una pgina de cdigos; por ejemplo, 850.
Importante
SQL Server no admite la pgina de cdigos 65001 codificacin UTF8.
DATAFILETYPE = {'char' | 'native' | 'widechar' | 'widenative' }
Especifica que BULK INSERT realiza la operacin de importacin con el valor de tipo de archivo de datos especificado.
Valor de
DATAFILETYPE
Todos los datos representados en:
char (valor
predeterminado)
Formato de caracteres.
Para obtener ms informacin, vea Usar el formato de caracteres para importar o exportar datos (SQL Server).
native Tipos de datos nativos (base de datos). Cree el archivo de datos nativos mediante la importacin masiva de datos desde SQL Server con
la utilidad bcp.
El valor native ofrece una alternativa de mayor rendimiento al valor char.
Para obtener ms informacin, vea Usar el formato nativo para importar o exportar datos (SQL Server).
widechar Caracteres Unicode.
Para obtener ms informacin, vea Usar el formato de caracteres Unicode para importar o exportar datos (SQL Server).
widenative Tipos de datos nativos (base de datos), salvo en las columnas char, varchar y text en las que los datos se almacenan como datos
Unicode. Cree el archivo de datos de widenativemediante la importacin masiva de datos desde SQL Server con la utilidad bcp.
El valor widenative ofrece una alternativa de mayor rendimiento a widechar. Si el archivo de datos contiene caracteres extendidos ANSI,
especifique widenative.
Para obtener ms informacin, vea Usar el formato nativo Unicode para importar o exportar datos (SQL Server).
FIELDTERMINATOR ='field_terminator'
Especifica el terminador de campo que se va a utilizar para archivos de datos de tipo char y widechar. El terminador de campo predeterminado es \t
(tabulador). Para obtener ms informacin, vea Especificar terminadores de campo y de fila (SQL Server).
FIRSTROW =first_row
Especifica el nmero de la primera fila que se va a cargar. El valor predeterminado es la primera fila del archivo de datos especificado. FIRSTROW comienza en
1.
Nota
El atributo FIRSTROW no est pensado para saltar los encabezados de columna. La instruccin BULK INSERT no permite omitir los encabezados. Al omitir
filas, Motor de base de datos de SQL Server solo analiza los terminadores de campo y no valida los datos en los campos de las filas omitidas.
FIRE_TRIGGERS
Especifica que se ejecutarn todos los desencadenadores de insercin definidos en la tabla de destino durante la operacin de importacin masiva. Si se
definen desencadenadores para operaciones INSERT en la tabla de destino, se activan para cada lote completado.
Si no se especifica FIRE_TRIGGERS, no se ejecuta ningn desencadenador de insercin.
FORMATFILE ='format_file_path'
Especifica la ruta de acceso completa de un archivo de formato. Un archivo de formato describe el archivo de datos que contiene respuestas almacenadas
creado con la utilidad bcp en la misma tabla o vista. Se debe usar el archivo de formato si:
El archivo de datos contiene un nmero de columnas mayor o menor que la tabla o vista.
Las columnas estn en un orden diferente.
Los delimitadores de columna varan.
Hay otros cambios en el formato de los datos. Los archivos de formato se suelen crear con la utilidad bcp y se modifican con un procesador de texto si
es necesario. Para obtener ms informacin, vea bcp (utilidad).
KEEPIDENTITY
Especifica que se utilizar el valor o valores de identidad del archivo de datos importado para la columna de identidad. Si no se especifica KEEPIDENTITY, los
valores de identidad de esta columna se comprueban pero no se importan y SQL Server asigna automticamente valores nicos basados en los valores de
inicializacin y de incremento especificados durante la creacin de la tabla. Si el archivo de datos no contiene valores para la columna de identidad de la tabla o
vista, utilice un archivo de formato para especificar que se debe omitir la columna de identidad de la tabla o vista cuando se importen los datos; SQL Server
asigna automticamente valores nicos para la columna. Para obtener ms informacin, vea DBCC CHECKIDENT (Transact-SQL).
Para obtener ms informacin acerca de cmo mantener los valores de identidad, vea Mantener valores de identidad al importar datos de forma masiva (SQL
Server).
KEEPNULLS
Especifica que las columnas vacas deben conservar un valor NULL durante la operacin de importacin masiva, en lugar de tener valores predeterminados para
las columnas insertadas. 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. De forma predeterminada, el valor de KILOBYTES_PER_BATCH es
desconocido. Para obtener informacin acerca de consideraciones de rendimiento, vea la seccin "Comentarios" ms adelante en este tema.
LASTROW=last_row
Especifica el nmero de la ltima fila que se va a cargar. El valor predeterminado es 0, que indica la ltima fila del archivo de datos especificado.
MAXERRORS = max_errors
Especifica el nmero mximo de errores de sintaxis permitidos en los datos antes de cancelar la operacin de importacin masiva. Cada fila que no se puede
importar con la operacin de importacin masiva se omite y se considera un error. Si no se especifica max_errors, el valor predeterminado es 10.
Nota
La opcin MAX_ERRORS no se aplica para comprobar restricciones ni para convertir tipos de datos money y bigint.
ORDER ( {column [ ASC | DESC ] }[ ,... n ] )
Especifica la forma en que estn ordenados los datos del archivo de datos. El rendimiento de la importacin masiva mejora si los datos importados se ordenan
segn el ndice clster de la tabla, si lo hay. Si el archivo de datos se ordena siguiendo otro criterio que no sea el orden de una clave de ndice clster, o si no
hay ningn ndice clster en la tabla, la clusula ORDER se pasa por alto. Los nombres de columna facilitados deben ser nombres vlidos en la tabla de destino.
De forma predeterminada, la operacin de insercin masiva presupone que los datos del archivo no estn ordenados. Para optimizar las operaciones de
importacin masiva, SQL Server tambin se valida que los datos importados estn ordenados.
n
Es un marcador de posicin que indica que se pueden especificar varias columnas.
ROWS_PER_BATCH =rows_per_batch
Indica el nmero aproximado de filas de datos del archivo de datos.
De forma predeterminada, todos los datos del archivo de datos se envan al servidor en una sola transaccin y el optimizador de consultas desconoce el
nmero de filas del lote. Si especifica ROWS_PER_BATCH con el valor > 0 el servidor utiliza este valor para optimizar la operacin de importacin masiva. El
valor especificado para ROWS_PER_BATCH debe ser aproximadamente el mismo que el nmero real de filas. Para obtener informacin acerca de
consideraciones de rendimiento, vea la seccin "Comentarios" ms adelante en este tema.
ROWTERMINATOR ='row_terminator'
Especifica el terminador de fila que se va a utilizar para archivos de datos de tipo char y widechar. El terminador de fila predeterminado es \r\n carcter de
nueva lnea. Para obtener ms informacin, vea Especificar terminadores de campo y de fila (SQL Server).
TABLOCK
Especifica que se obtiene un bloqueo de tabla durante la operacin de importacin masiva. Varios clientes pueden cargar una tabla simultneamente si sta no
tiene ndices y se especifica TABLOCK. De forma predeterminada, el comportamiento del bloqueo viene determinado por la opcin de tabla table lock on bulk
load. Al mantener un bloqueo durante la operacin de importacin masiva, se reduce la contencin por bloqueos de la tabla y en algunos casos puede
mejorarse notablemente el rendimiento. Para obtener informacin acerca de consideraciones de rendimiento, vea la seccin "Comentarios" ms adelante en este
tema.
ERRORFILE ='file_name'
Especifica el archivo utilizado para recopilar filas que tienen errores de formato y no pueden convertirse en un conjunto de filas OLE DB. Estas filas se copian en
este archivo de errores desde el archivo de datos "tal cual".
El archivo de errores se crea cuando se ejecuta el comando. Se produce un error si el archivo ya existe. Adems, se crea un archivo de control con la extensin
.ERROR.txt. Este archivo hace referencia a cada fila del archivo de errores y proporciona diagnsticos de errores. Tan pronto como se corrigen los errores, se
pueden cargar los datos.
Compatibilidad
BULK INSERT aplica una estricta validacin y comprobacin de los datos ledos de un archivo que pueden dar lugar a errores en los scripts existentes cuando se
ejecutan en datos no vlidos. Por ejemplo, BULK INSERT comprueba que:
Las representaciones nativas de los tipos de datos float o real son vlidas.
Los datos Unicode tienen una longitud de bytes uniforme.
Tipos de datos
Conversiones de tipos de datos de cadena a decimal
Las conversiones de tipos de datos de cadena a decimal utilizadas en BULK INSERT siguen las mismas reglas que la funcin CONVERT de Transact-SQL, que rechaza las
cadenas que representan valores numricos con notacin cientfica. Por lo tanto, BULK INSERT trata esas cadenas como valores no vlidos y genera errores de
conversin.
Para solucionar este comportamiento, use un archivo de formato para la importacin masiva de datos de tipo float con notacin cientfica en una columna con valores
decimales. En el archivo de formato, describa explcitamente la columna como de datos real o float. Para obtener ms informacin acerca de estos tipos de datos, vea
float y real (Transact-SQL).
Nota
Los archivos de formato representan los datos real como el tipo de datos SQLFLT4 y los datos float como el tipo de datos SQLFLT8. Para obtener informacin
acerca de los archivos de formato no XML, vea Especificar el tipo de almacenamiento en archivo mediante bcp (SQL Server).
Ejemplo de importacin de un valor numrico que utiliza notacin cientfica
En este ejemplo se utiliza la siguiente tabla:
El usuario desea importar masivamente datos en la tabla t _f l oat . El archivo de datos (C:\t_float-c.dat) contiene datos float con notacin cientfica; por ejemplo:
No obstante, BULK INSERT no puede importar estos datos directamente en t _f l oat , ya que su segunda columna, c2, utiliza el tipo de datos deci mal . Por lo tanto, es
necesario un archivo de formato. El archivo de formato debe asignar los datos float con notacin cientfica al formato decimal de la columna c2.
El siguiente archivo de formato utiliza el tipo de datos SQLFLT8 para asignar el segundo campo de datos a la segunda columna:
<?xml ver si on="1. 0"?>
<BCPFORMAT xml ns="ht t p: / / schemas. mi cr osof t . com/ sql ser ver / 2004/ bul kl oad/ f or mat " xml ns: xsi ="ht t p: / / www. w3. or g/ 2001/ XMLSchema- i nst ance">
<RECORD>
<FI ELD I D="1" xsi : t ype="Char Ter m" TERMI NATOR="\ t " MAX_LENGTH="30"/ >
<FI ELD I D="2" xsi : t ype="Char Ter m" TERMI NATOR="\ r \ n" MAX_LENGTH="30"/ ></ RECORD><ROW>
<COLUMN SOURCE="1" NAME="c1" xsi : t ype="SQLFLT8"/ >
<COLUMN SOURCE="2" NAME="c2" xsi : t ype="SQLFLT8"/ ></ ROW></ BCPFORMAT>
Para utilizar este archivo de formato (con el nombre de archivo C: \ t _f l oat f or mat - c- xml . xml ) para importar los datos de prueba en la tabla de prueba, emita la
siguiente instruccin TransactSQL:
Tipos de datos para importar o exportar masivamente documentos SQLXML
Para importar o exportar de forma masiva datos SQLXML, utilice uno de los tipos de datos siguientes en el archivo de formato:
Tipo de datos Efecto
SQLCHAR o
SQLVARCHAR
Los datos se envan en la pgina de cdigos del cliente o en la pgina de cdigos implcita en la intercalacin. El efecto es el mismo que si se
especifica DATAFILETYPE ='char' sin especificar un archivo de formato.
SQLNCHAR o
SQLNVARCHAR
Los datos se envan como Unicode. El efecto es el mismo que si se especifica DATAFILETYPE = 'widechar' sin especificar un archivo de
formato.
SQLBINARY o
SQLVARBIN
Los datos se envan sin realizar ninguna conversin.
Comentarios generales
CREATE TABLE t _f l oat ( c1 f l oat , c2 deci mal ( 5, 4) ) ;
8. 0000000000000002E- 28. 0000000000000002E- 2
BULK I NSERT bul kt est . . t _f l oat
FROM' C: \ t _f l oat - c. dat ' WI TH ( FORMATFI LE=' C: \ t _f l oat f or mat - c- xml . xml ' ) ;
GO
Para obtener una comparacin de la instruccin BULK INSERT, la instruccin INSERT ... SELECT * FROM OPENROWSET(BULK...) y el comando bcp, vea Importar y
exportar datos de forma masiva (SQL Server).
Para obtener informacin sobre cmo preparar los datos para la importacin masiva, vea Preparar los datos para exportar o importar de forma masiva (SQL Server).
La instruccin BULK INSERT se puede ejecutar en una transaccin definida por el usuario para importar datos en una tabla o una vista. Opcionalmente, para utilizar
varias coincidencias para la importacin masiva de datos, una transaccin puede especificar la clusula BATCHSIZE en la instruccin BULK INSERT. Si una transaccin de
varios lotes se revierte, cada lote que la transaccin ha enviado a SQL Server se revierte.
Interoperabilidad
Importar datos desde un archivo CSV
Las operaciones de importacin masiva de SQL Server no admiten los archivos de valores separados por comas CSV. Sin embargo, en algunos casos se puede utilizar
un archivo de valores separados por comas CSV como archivo de datos para una importacin masiva de datos en SQL Server. Para obtener informacin acerca de
los requisitos para importar datos de un archivo de datos CSV, vea Preparar los datos para exportar o importar de forma masiva (SQL Server).
Comportamiento del registro
Para obtener informacin acerca de cundo se registran en el registro de transacciones las operaciones de insercin de filas que se efectan durante la importacin
masiva, vea Requisitos previos para el registro mnimo durante la importacin masiva.
Restricciones
Cuando se usa un archivo de formato con BULK INSERT, solo se puede especificar un mximo de 1024 campos. Es el mismo nmero mximo de columnas permitido en
una tabla. Si usa BULK INSERT con un archivo de datos que contenga ms de 1024 campos, BULK INSERT genera el error 4822. La utilidad bcp no tiene esta limitacin,
por lo que para los archivos de datos que contengan ms de 1024 campos use el comando bcp.
Consideraciones de rendimiento
Si el nmero de pginas que van a vaciarse en un nico lote supera un umbral interno, podra producirse un examen completo del grupo de bferes para identificar
qu pginas se han de vaciar cuando el lote se confirme. Este examen completo puede afectar de forma desfavorable al rendimiento de la importacin masiva. Un caso
en el que es probable que se supere el umbral interno se produce cuando un grupo de bferes grande se combina con un subsistema de E/S lento. Para evitar los
desbordamientos del bfer en equipos grandes, no utilice la sugerencia TABLOCK que quita la optimizacin masiva o use un tamao de lote menor que la preserva.
Dado que los equipos varan, es recomendable que pruebe varios tamaos de lote con la carga de datos para averiguar lo que funciona mejor en su caso.
Seguridad
Delegacin de cuentas de seguridad suplantacin
Si un usuario utiliza un inicio de sesin de SQL Server, se utilizar el perfil de seguridad de la cuenta de proceso de SQL Server. Un inicio de sesin mediante la
autenticacin de SQL Server no puede autenticarse fuera del motor de base de datos. Por tanto, cuando un inicio de sesin mediante la autenticacin de SQL Server
inicia un comando BULK INSERT, la conexin con los datos se realiza utilizando el contexto de seguridad de la cuenta de proceso de SQL Server la cuenta que utiliza el
servicio del motor de base de datos de SQL Server). Para leer correctamente los datos de origen, debe conceder acceso a los datos de origen a la cuenta utilizada por
el motor de base de datos de SQL Server. En cambio, si un usuario de SQL Server inicia sesin con la autenticacin de Windows, el usuario solo puede leer los archivos
a los que tiene acceso la cuenta de usuario, independientemente del perfil de seguridad del proceso de SQL Server.
Si al ejecutar la instruccin BULK INSERT utiliza sqlcmd u osql desde un equipo e inserta datos en SQL Server en un segundo equipo y especifica data_file en un tercer
equipo con una ruta de acceso UNC, es posible que reciba el error 4861.
Para resolver este error, utilice la autenticacin de SQL Server y especifique un inicio de sesin de SQL Server, que utiliza el perfil de seguridad de la cuenta del proceso
de SQL Server, o bien configure Windows para habilitar la delegacin de la cuenta de seguridad. Para obtener informacin acerca de cmo habilitar una cuenta de
usuario para que sea de confianza para la delegacin, vea la Ayuda de Windows.
Para obtener ms informacin acerca de esta y otras consideraciones de seguridad en el uso de BULK INSERT, vea Importar de forma masiva datos mediante BULK
INSERT u OPENROWSET(BULK...) (SQL Server).
Permisos
Se requieren los permisos INSERT y ADMINISTER BULK OPERATIONS. Adems, es necesario el permiso ALTER TABLE si se da una o varias de las siguientes
circunstancias:
Existen restricciones y no se ha especificado la opcin CHECK_CONSTRAINTS.
Nota
El comportamiento predeterminado es deshabilitar las restricciones. Para comprobar las restricciones CHECK explcitamente, utilice la opcin
CHECK_CONSTRAINTS.
Existen desencadenadores y no se ha especificado la opcin FIRE_TRIGGER.
Nota
De manera predeterminada no se activan los desencadenadores. Para activar los desencadenadores explcitamente, use la opcin FIRE_TRIGGER.
Se utiliza la opcin KEEPIDENTITY para importar el valor de identidad de un archivo de datos.
Ejemplos
A.Usar canalizaciones para importar datos de un archivo
En el siguiente ejemplo se importa informacin detallada de pedidos en la tabla Advent ur eWor ks2012. Sal es. Sal esOr der Det ai l desde un archivo de datos
especificado utilizando una canalizacin | ) como terminador de campo y | \ n como terminador de fila.
B.Usar el argumento FIRE_TRIGGERS
En el ejemplo siguiente se especifica el argumento FI RE_TRI GGERS.
C.Usar el salto de lnea como terminador de fila
En el siguiente ejemplo se importa un archivo que utiliza el salto de lnea como terminador de fila, igual que en una salida de UNIX:
Nota
Debido al modo en que Microsoft Windows trata los archivos de texto, (\n se reemplaza automticamente por \r\n).
Otros ejemplos
Se proporcionan otros ejemplos de uso de BULK INSERT en los temas siguientes:
Ejemplos de importacin y exportacin de forma masiva documentos XML SQL Server
Mantener valores de identidad al importar datos de forma masiva (SQL Server)
Mantener valores NULL o usar valores predeterminados durante la importacin masiva SQL Server
Especificar terminadores de campo y de fila (SQL Server)
Usar un archivo de formato para importar datos de forma masiva (SQL Server)
Usar el formato de caracteres para importar o exportar datos (SQL Server)
Usar el formato nativo para importar o exportar datos (SQL Server)
Usar el formato de caracteres Unicode para importar o exportar datos (SQL Server)
Usar el formato nativo Unicode para importar o exportar datos (SQL Server)
Usar un archivo de formato para omitir una columna de tabla (SQL Server)
Usar un archivo de formato para asignar columnas de tabla a campos de un archivo de datos (SQL Server)
Vea tambin
BULK I NSERT Advent ur eWor ks2012. Sal es. Sal esOr der Det ai l
FROM' f : \ or der s\ l i nei t em. t bl '
WI TH
(
FI ELDTERMI NATOR =' | ' ,
ROWTERMI NATOR =' | \ n'
) ;
BULK I NSERT Advent ur eWor ks2012. Sal es. Sal esOr der Det ai l
FROM' f : \ or der s\ l i nei t em. t bl '
WI TH
(
FI ELDTERMI NATOR =' | ' ,
ROWTERMI NATOR =' : \ n' ,
FI RE_TRI GGERS
) ;
DECLARE @bul k_cmd var char ( 1000) ;
SET @bul k_cmd =' BULK I NSERT Advent ur eWor ks2012. Sal es. Sal esOr der Det ai l
FROM' ' <dr i ve>: \ <pat h>\ <f i l ename>' '
WI TH ( ROWTERMI NATOR =' ' ' +CHAR( 10) +' ' ' ) ' ;
EXEC( @bul k_cmd) ;
Referencia
bcp (utilidad)
INSERT (Transact-SQL)
OPENROWSET (Transact-SQL)
sp_tableoption (Transact-SQL)
Conceptos
Importar y exportar datos de forma masiva (SQL Server)
Archivos de formato para importar o exportar datos (SQL Server)
Preparar los datos para exportar o importar de forma masiva (SQL Server)
2014 Microsoft
DELETE (Transact-SQL)
Quita una o varias filas de una tabla o vista de SQL Server.
Se aplica a: SQL Server (desde SQL Server 2008 hasta la versin actual, Windows Azure SQL Database desde la versin inicial hasta la versin actual).
Convenciones de sintaxis de Transact-SQL
Sintaxis
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_table_expression (Transact-SQL).
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
Se aplica a: SQL Server 2008 a SQL Server 2014.
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.
SQL Server 2014
[ WI TH <common_t abl e_expr essi on>[ , . . . n ] ]
DELETE
[ TOP ( expr essi on ) [ PERCENT ] ]
[ FROM]
{ { t abl e_al i as
| <obj ect >
| r owset _f unct i on_l i mi t ed
[ WI TH ( t abl e_hi nt _l i mi t ed [ . . . n ] ) ] }
| @t abl e_var i abl e
}
[ <OUTPUT Cl ause>]
[ FROMt abl e_sour ce [ , . . . n ] ]
[ WHERE { <sear ch_condi t i on>
| { [ CURRENT OF
{ { [ GLOBAL ] cur sor _name }
| cur sor _var i abl e_name
}
]
}
}
]
[ OPTI ON ( <Quer y Hi nt >[ , . . . n ] ) ]
[ ; ]
<obj ect >: : =
{
[ ser ver _name. dat abase_name. schema_name.
| dat abase_name. [ schema_name ] .
| schema_name.
]
t abl e_or _vi ew_name
}
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
Se aplica a: SQL Server 2008 a SQL Server 2014.
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 TransactSQL.
FROM table_source
Especifica una clusula FROM adicional. Esta extensin de TransactSQL 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 TransactSQL.
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. TRUNCATE TABLE tiene restricciones; por ejemplo, la tabla no puede participar en la replicacin. Para obtener ms informacin, vea TRUNCATE TABLE
(Transact-SQL).
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 Transact-SQL.
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 datos
db_owner y db_datawriter y al propietario de la tabla. Los miembros de los roles sysadmin, db_owner y db_securityadmin y el propietario de la tabla pueden
transferir permisos a otros usuarios.
Ejemplos
Categora Elementos de sintaxis ofrecidos
Sintaxis bsica DELETE
Limitar las filas eliminadas WHERE FROM cursor
Eliminar filas de una tabla remota Servidor vinculado funcin de conjunto de filas OPENQUERY funcin de conjunto de
filas OPENDATASOURCE
Invalidar el comportamiento predeterminado del optimizador de consultas
mediante sugerencias
Sugerencias de tabla sugerencias de consulta
Capturar los resultados de la instruccin DELETE 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 Sal esPer sonQuot aHi st or y de la base de datos AdventureWorks2012 porque no se utiliza una clusula
WHERE para limitar el nmero de filas eliminadas.
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 Pr oduct Cost Hi st or y de la base de datos AdventureWorks2012 en las que el valor de la columna
St andar dCost es superior a 1000. 00.
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 St andar dCost debe estar comprendido entre 12. 00 y 14. 00 y el valor de la columna Sel l EndDat e debe ser NULL. En el ejemplo
se imprime tambin el valor desde la funcin @@ROWCOUNT para devolver el nmero de filas eliminadas.
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 Empl oyeePayHi st or y de la base de datos AdventureWorks2012 mediante un cursor denominado mycur sor .
La operacin de eliminacin solo afecta a la nica fila que se captura actualmente del cursor.
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 Sal esPer sonQuot aHi st or y de la base de datos AdventureWorks2012 basndose en las ventas del ao hasta la fecha almacenadas en la tabla Sal esPer son. La
primera instruccin DELETE muestra la solucin de subconsulta compatible con ISO y la segunda instruccin DELETE muestra la extensin de FROM de Transact
SQL para unir las dos tablas.
DELETE FROMSal es. Sal esPer sonQuot aHi st or y;
GO
DELETE FROMPr oduct i on. Pr oduct Cost Hi st or y
WHERE St andar dCost >1000. 00;
GO
DELETE Pr oduct i on. Pr oduct Cost Hi st or y
WHERE St andar dCost BETWEEN 12. 00 AND 14. 00
AND EndDat e I S NULL;
PRI NT ' Number of r ows del et ed i s ' +CAST( @@ROWCOUNT as char ( 3) ) ;
DECLARE compl ex_cur sor CURSOR FOR
SELECT a. Busi nessEnt i t yI D
FROMHumanResour ces. Empl oyeePayHi st or y AS a
WHERE Rat eChangeDat e <>
( SELECT MAX( Rat eChangeDat e)
FROMHumanResour ces. Empl oyeePayHi st or y AS b
WHERE a. Busi nessEnt i t yI D =b. Busi nessEnt i t yI D) ;
OPEN compl ex_cur sor ;
FETCH FROMcompl ex_cur sor ;
DELETE FROMHumanResour ces. Empl oyeePayHi st or y
WHERE CURRENT OF compl ex_cur sor ;
CLOSE compl ex_cur sor ;
DEALLOCATE compl ex_cur sor ;
GO
- - SQL- 2003 St andar d subquer y
DELETE FROMSal es. Sal esPer sonQuot aHi st or y
WHERE Busi nessEnt i t yI D I N
( SELECT Busi nessEnt i t yI D
FROMSal es. Sal esPer son
WHERE Sal esYTD >2500000. 00) ;
GO
- - Tr ansact - SQL ext ensi on
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 Pur chaseOr der Det ai l de la base de datos AdventureWorks2012 cuyas fechas de vencimiento sean anteriores al primero de julio
de 2006.
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 Pur chaseOr der Det ai l 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 Pur chaseOr der I D) 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.
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.
Se aplica a: SQL Server 2008 a SQL Server 2014.
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, MyLi nkSer ver , se especifica entonces como parte del nombre de objeto de cuatro partes en el formato server.catalog.schema.object.
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.
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.
DELETE FROMSal es. Sal esPer sonQuot aHi st or y
FROMSal es. Sal esPer sonQuot aHi st or y AS spqh
I NNER J OI N Sal es. Sal esPer son AS sp
ON spqh. Busi nessEnt i t yI D =sp. Busi nessEnt i t yI D
WHERE sp. Sal esYTD >2500000. 00;
GO
DELETE TOP ( 20)
FROMPur chasi ng. Pur chaseOr der Det ai l
WHERE DueDat e <' 20020701' ;
GO
DELETE FROMPur chasi ng. Pur chaseOr der Det ai l
WHERE Pur chaseOr der Det ai l I D I N
( SELECT TOP 10 Pur chaseOr der Det ai l I D
FROMPur chasi ng. Pur chaseOr der Det ai l
ORDER BY DueDat e ASC) ;
GO
USE mast er ;
GO
- - Cr eat e a l i nk t o t he r emot e dat a sour ce.
- - Speci f y a val i d ser ver name f or @dat asr c as ' ser ver _name' or ' ser ver _name\ i nst ance_name' .
EXEC sp_addl i nkedser ver @ser ver =N' MyLi nkSer ver ' ,
@sr vpr oduct =N' ' ,
@pr ovi der =N' SQLNCLI ' ,
@dat asr c =N' ser ver _name' ,
@cat al og =N' Advent ur eWor ks2012' ;
GO
- - Speci f y t he r emot e dat a sour ce usi ng a f our - par t name
- - i n t he f or ml i nked_ser ver . cat al og. schema. obj ect .
DELETE MyLi nkSer ver . Advent ur eWor ks2012. HumanResour ces. Depar t ment WHERE Depar t ment I D >16;
GO
DELETE OPENQUERY ( MyLi nkSer ver , ' SELECT Name, Gr oupName FROMAdvent ur eWor ks2012. HumanResour ces. Depar t ment
WHERE Depar t ment I D =18' ) ;
GO
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 en la base de datos AdventureWorks2012.
B.Usar OUTPUT con <from_table_name> en una instruccin DELETE
En el ejemplo siguiente se eliminan las filas de la tabla Pr oduct Pr oduct Phot o de la base de datos AdventureWorks2012 segn los criterios de bsqueda definidos en la
clusula FROMde la instruccin DELETE. La clusula OUTPUT devuelve columnas de la tabla que se elimina (DELETED. Pr oduct I D, DELETED. Pr oduct Phot oI D) y de la tabla
Pr oduct . Esta informacin se utiliza en la clusula FROMpara especificar las filas que se deben eliminar.
Vea tambin
Referencia
CREATE TRIGGER (Transact-SQL)
INSERT (Transact-SQL)
SELECT (Transact-SQL)
TRUNCATE TABLE (Transact-SQL)
UPDATE (Transact-SQL)
WITH common_table_expression (Transact-SQL)
@@ROWCOUNT (Transact-SQL)
2014 Microsoft
DELETE FROMOPENDATASOURCE( ' SQLNCLI ' ,
' Dat a Sour ce=<ser ver _name>; I nt egr at ed Secur i t y=SSPI ' )
. Advent ur eWor ks2012. HumanResour ces. Depar t ment
WHERE Depar t ment I D =17; '
DELETE Sal es. Shoppi ngCar t I t em
OUTPUT DELETED. *
WHERE Shoppi ngCar t I D =20621;
- - Ver i f y t he r ows i n t he t abl e mat chi ng t he WHERE cl ause have been del et ed.
SELECT COUNT( *) AS [ Rows i n Tabl e] FROMSal es. Shoppi ngCar t I t emWHERE Shoppi ngCar t I D =20621;
GO
DECLARE @MyTabl eVar t abl e (
Pr oduct I D i nt NOT NULL,
Pr oduct Name nvar char ( 50) NOT NULL,
Pr oduct Model I D i nt NOT NULL,
Phot oI D i nt NOT NULL) ;
DELETE Pr oduct i on. Pr oduct Pr oduct Phot o
OUTPUT DELETED. Pr oduct I D,
p. Name,
p. Pr oduct Model I D,
DELETED. Pr oduct Phot oI D
I NTO @MyTabl eVar
FROMPr oduct i on. Pr oduct Pr oduct Phot o AS ph
J OI N Pr oduct i on. Pr oduct as p
ON ph. Pr oduct I D =p. Pr oduct I D
WHERE p. Pr oduct Model I D BETWEEN 120 and 130;
- - Di spl ay t he r esul t s of t he t abl e var i abl e.
SELECT Pr oduct I D, Pr oduct Name, Pr oduct Model I D, Phot oI D
FROM@MyTabl eVar
ORDER BY Pr oduct Model I D;
GO
FROM (Transact-SQL)
Especifica las tablas, vistas, tablas derivadas y tablas combinadas que se utilizan en las instrucciones DELETE, SELECT y UPDATE en SQL Server 2014. En la instruccin
SELECT, la clusula FROM es necesaria excepto cuando la lista de seleccin solo contiene constantes, variables y expresiones aritmticas sin nombres de columna.
Se aplica a: SQL Server (desde SQL Server 2008 hasta la versin actual, Windows Azure SQL Database desde la versin inicial hasta la versin actual).
Convenciones de sintaxis de Transact-SQL
Sintaxis
Argumentos
<table_source>
Especifica el origen de una tabla, una vista, una tabla variable o una tabla derivada, con o sin alias, para utilizarlo en la instruccin TransactSQL. Se pueden
utilizar hasta 256 orgenes de tabla en una instruccin, aunque el lmite vara en funcin de la memoria disponible y de la complejidad del resto de las
expresiones de la consulta. Las consultas individuales pueden no admitir un mximo de 256 orgenes de tabla.
Nota
El rendimiento de las consultas se puede ver afectado si se hace referencia a un nmero elevado de tablas en ellas. El tiempo de compilacin y optimizacin
tambin se puede ver afectado por factores adicionales. Dichos factores pueden ser la presencia de ndices y vistas indizadas en cada <table_source> y el
tamao de <select_list> en la instruccin SELECT.
El orden de los orgenes de tabla despus de la palabra clave FROM no afecta al conjunto de resultados devuelto. SQL Server devuelve errores si aparecen
nombres duplicados en la clusula FROM.
SQL Server 2014
[ FROM{ <t abl e_sour ce>} [ , . . . n ] ]
<t abl e_sour ce>: : =
{
t abl e_or _vi ew_name [ [ AS ] t abl e_al i as ] [ <t abl esampl e_cl ause>]
[ WI TH ( <t abl e_hi nt >[ [ , ] . . . n ] ) ]
| r owset _f unct i on [ [ AS ] t abl e_al i as ]
[ ( bul k_col umn_al i as [ , . . . n ] ) ]
| user _def i ned_f unct i on [ [ AS ] t abl e_al i as ] ]
| OPENXML <openxml _cl ause>
| der i ved_t abl e [ AS ] t abl e_al i as [ ( col umn_al i as [ , . . . n ] ) ]
| <j oi ned_t abl e>
| <pi vot ed_t abl e>
| <unpi vot ed_t abl e>
| @var i abl e [ [ AS ] t abl e_al i as ]
| @var i abl e. f unct i on_cal l ( expr essi on [ , . . . n ] ) [ [ AS ] t abl e_al i as ] [ ( col umn_al i as [ , . . . n ] ) ]
}
<t abl esampl e_cl ause>: : =
TABLESAMPLE [ SYSTEM] ( sampl e_number [ PERCENT | ROWS ] )
[ REPEATABLE ( r epeat _seed ) ]
<j oi ned_t abl e>: : =
{
<t abl e_sour ce><j oi n_t ype><t abl e_sour ce>ON <sear ch_condi t i on>
| <t abl e_sour ce>CROSS J OI N <t abl e_sour ce>
| l ef t _t abl e_sour ce { CROSS | OUTER } APPLY r i ght _t abl e_sour ce
| [ ( ] <j oi ned_t abl e>[ ) ]
}
<j oi n_t ype>: : =
[ { I NNER | { { LEFT | RI GHT | FULL } [ OUTER ] } } [ <j oi n_hi nt >] ]
J OI N
<pi vot ed_t abl e>: : =
t abl e_sour ce PI VOT <pi vot _cl ause>[ AS ] t abl e_al i as
<pi vot _cl ause>: : =
( aggr egat e_f unct i on ( val ue_col umn [ [ , ] . . . n ] )
FOR pi vot _col umn
I N ( <col umn_l i st >)
)
<unpi vot ed_t abl e>: : =
t abl e_sour ce UNPI VOT <unpi vot _cl ause>[ AS ] t abl e_al i as
<unpi vot _cl ause>: : =
( val ue_col umn FOR pi vot _col umn I N ( <col umn_l i st >) )
<col umn_l i st >: : =
col umn_name [ , . . . n ]
table_or_view_name
Es el nombre de una tabla o una vista.
Si la tabla o la vista existen en otra base de datos de la misma instancia de SQL Server, utilice un nombre completo con el formato database.schema.object_name.
Si la tabla o la vista existen fuera de la instancia de SQL Serverl, utilice un nombre de cuatro partes con el formato linked_server.catalog.schema.object. Para
obtener ms informacin, vea sp_addlinkedserver (Transact-SQL). El nombre de cuatro partes de la tabla o la vista creado con la funcin OPENDATASOURCE
como la parte de servidor del nombre tambin se puede utilizar para especificar el origen de tabla remoto. Cuando se especifica OPENDATASOURCE, es posible
que database_name y schema_nameno se puedan aplicar a todos los orgenes de datos y dependan de las funciones del proveedor OLE DB que tiene acceso al
objeto remoto.
[AS] table_alias
Es un alias para table_sourceque se puede utilizar por comodidad o para distinguir una tabla o una vista en una autocombinacin o una subconsulta. El alias
suele ser un nombre de tabla abreviado que se utiliza para hacer referencia a columnas especficas de las tablas en una combinacin. Si el mismo nombre de
columna existe en ms de una tabla en una combinacin, SQL Server requiere que el nombre de columna sea calificado mediante un nombre de tabla, un
nombre de vista o un alias. No se puede utilizar el nombre de la tabla si se ha definido un alias.
Si se utiliza una tabla derivada, una funcin de conjuntos de filas o con valores de tabla, o una clusula de operador como PIVOT o UNPIVOT, el parmetro
table_alias requerido al final de la clusula es el nombre de tabla asociado para todas las columnas devueltas, incluidas las columnas de agrupacin.
WITH (<sugerencia_de_tabla> )
Especifica que el optimizador de consultas utiliza una estrategia de optimizacin o bloqueo con esta tabla y para esta instruccin. Para obtener ms informacin,
vea Sugerencias de tabla (Transact-SQL).
rowset_function
Se aplica a: SQL Server 2008 a SQL Server 2014.
Especifica una de las funciones de conjuntos de filas, como OPENROWSET, que devuelve un objeto que se puede utilizar en lugar de una referencia de tabla.
Para obtener ms informacin acerca de la lista de funciones de conjuntos de filas, vea Funciones de conjuntos de filas (Transact-SQL).
El uso de las funciones OPENROWSET y OPENQUERY para especificar que un objeto remoto depende de las capacidades del proveedor OLE DB que tiene
acceso al objeto.
bulk_column_alias
Se aplica a: SQL Server 2008 a SQL Server 2014.
Es un alias opcional para sustituir el nombre de una columna en el conjunto de resultados. Los alias de columna se permiten solo en las instrucciones SELECT
que utilizan la funcin OPENROWSET con la opcin BULK. Si utiliza bulk_column_alias, especifique un alias para cada columna de tabla en el mismo orden que las
columnas del archivo.
Nota
Este alias invalida al atributo NAME de los elementos COLUMN de un archivo de formato XML si est presente.
user_defined_function
Especifica una funcin con valores de tabla.
OPENXML <openxml_clause>
Se aplica a: SQL Server 2008 a SQL Server 2014.
Proporciona una vista de un conjunto de filas en un documento XML. Para obtener ms informacin, vea OPENXML (Transact-SQL).
derived_table
Es una subconsulta que recupera filas de la base de datos. derived_table se utiliza como entrada a la consulta externa.
derived _tablepuede utilizar la caracterstica de constructor de valores de TransactSQL para especificar varias filas. Por ejemplo, SELECT * FROM( VALUES ( 1,
2) , ( 3, 4) , ( 5, 6) , ( 7, 8) , ( 9, 10) ) AS MyTabl e( a, b) ; . Para obtener ms informacin, vea Constructor con valores de tabla (Transact-SQL).
column_alias
Es un alias opcional para sustituir el nombre de una columna en el conjunto de resultados de la tabla derivada. Incluya un alias de columna para cada columna
de la lista de seleccin y delimite la lista de alias de columna con parntesis.
<tablesample_clause>
Especifica que se devuelva un ejemplo de los datos de la tabla. El ejemplo puede ser aproximado. Esta clusula se puede utilizar en cualquier tabla principal o
combinada de una instruccin SELECT, UPDATE o DELETE. TABLESAMPLE no se puede especificar con vistas.
Nota
Cuando se utiliza TABLESAMPLE en bases de datos que se actualizan a SQL Server, el nivel de compatibilidad de la base de datos se establece en 110 o
superior y no se permite PIVOT en una consulta de expresin de tabla comn CTE recursiva. Para obtener ms informacin, vea Nivel de compatibilidad de
ALTER DATABASE (Transact-SQL).
SYSTEM
Se trata de un mtodo de muestreo dependiente de la implementacin especificado por los estndares ISO. En SQL Server, es el nico mtodo de muestreo
disponible y se aplica de forma predeterminada. SYSTEM aplica un mtodo de muestreo basado en pginas en el que se elige un conjunto de pginas aleatorio
de la tabla para el ejemplo y todas las filas de dichas pginas se devuelven como el subconjunto de ejemplo.
sample_number
Es una expresin numrica constante exacta o aproximada que representa el porcentaje o el nmero de filas. Si se especifica con PERCENT, sample_number se
convierte implcitamente a un valor float; en caso contrario, se convierte en bigint. PERCENT es el valor predeterminado.
PERCENT
Especifica que se debe recuperar de la tabla el porcentaje sample_number de filas de la tabla. Si se especifica PERCENT, SQL Server devuelve un valor
aproximado del porcentaje especificado. Si se especifica PERCENT, la expresin sample_number debe dar como resultado un valor comprendido entre 0 y 100.
ROWS
Especifica que se recupere aproximadamente el nmero sample_number de filas. Si se especifica ROWS, SQL Server devuelve una aproximacin del nmero de
filas especificado. Si se especifica ROWS, la expresin sample_number debe ser un valor entero mayor que cero.
REPEATABLE
Indica que el ejemplo seleccionado se puede devolver de nuevo. Si se especifica con el mismo valor de repeat_seed , SQL Server devuelve el mismo subconjunto
de filas siempre que no se hayan realizado cambios en las filas de la tabla. Si se especifica con otro valor de repeat_seed, es probable que SQL Server devuelva
un muestra distinto de filas de la tabla. Se consideran cambios en la tabla las siguientes acciones: insertar, actualizar, eliminar, volver a generar o desfragmentar
ndices, y restaurar o adjuntar bases de datos.
repeat_seed
Es una expresin de tipo entero constante utilizada por SQL Server para generar un nmero aleatorio. repeat_seed es de tipo bigint. Si no se especifica
repeat_seed, SQL Server asigna un valor de forma aleatoria. Para un valor repeat_seed especfico, el resultado del muestreo es siempre el mismo si no ha aplicado
ningn cambio a la tabla. La expresin repeat_seed debe ser un entero mayor que cero.
<joined_table>
Es un conjunto de resultados producto de dos o ms tablas. Para varias combinaciones, utilice parntesis para cambiar el orden natural de las combinaciones.
<join_type>
Especifica el tipo de operacin de combinacin.
INNER
Especifica que se devuelvan todos los pares de filas coincidentes. Rechaza las filas no coincidentes de las dos tablas. Si no se especifica ningn tipo de
combinacin, ste es el valor predeterminado.
FULL [ OUTER ]
Especifica que una fila de la tabla de la derecha o de la izquierda, que no cumpla la condicin de combinacin, se incluya en el conjunto de resultados y que las
columnas que correspondan a la otra tabla se establezcan en NULL. De esta forma se agregan ms filas a las que se suelen devolver con INNER JOIN.
LEFT [ OUTER ]
Especifica que todas las filas de la tabla izquierda que no cumplan la condicin de combinacin se incluyan en el conjunto de resultados, con las columnas de
resultados de la otra tabla establecidas en NULL, adems de todas las filas devueltas por la combinacin interna.
RIGHT [OUTER]
Especifica que todas las filas de la tabla derecha que no cumplan la condicin de combinacin se incluyan en el conjunto de resultados, con las columnas de
resultados de la otra tabla establecidas en NULL, adems de todas las filas devueltas por la combinacin interna.
<join_hint>
Especifica que el optimizador de consultas de SQL Server debe utilizar una sugerencia de combinacin o un algoritmo de ejecucin por cada combinacin
especificada en la clusula FROM de la consulta. Para obtener ms informacin, vea Sugerencias de combinacin TransactSQL.
JOIN
Indica que se va a ejecutar la operacin de combinacin especificada entre los orgenes de tabla o vistas indicados.
ON <search_condition>
Especifica la condicin en la que se basa la combinacin. La condicin puede especificar cualquier predicado, aunque se suelen utilizar columnas y operadores
de comparacin; por ejemplo:
Cuando la condicin especifique columnas, no ser necesario que tengan el mismo nombre o el mismo tipo de datos; sin embargo, si los tipos de datos no son
idnticos, deben ser compatibles o tratarse de tipos que SQL Server pueda convertir implcitamente. Si los tipos de datos no se pueden convertir implcitamente,
la condicin debe convertir de forma explcita el tipo de datos mediante la funcin CONVERT.
Puede haber predicados relacionados solamente con una de las tablas combinadas de la clusula ON. Estos predicados tambin pueden estar en la clusula
WHERE de la consulta. Aunque la posicin de estos predicados no produce ninguna diferencia en el caso de combinaciones INNER, podra generar un resultado
diferente si estuvieran implicadas las combinaciones OUTER. La razn es que los predicados de la clusula ON se aplican a la tabla antes de la combinacin,
mientras la clusula WHERE se aplica de forma semntica al resultado de la combinacin.
Para obtener ms informacin acerca de los predicados y las condiciones de bsqueda, vea Condiciones de bsqueda TransactSQL.
CROSS JOIN
Especifica el producto resultante de dos tablas. Devuelve las mismas filas que se devolveran si no se especificara la clusula WHERE en una combinacin de
estilo antiguo distinta del estilo de SQL-92.
left_table_source{CROSS | OUTER }APPLY right_table_source
Especifica que el argumento right_table_sourcedel operador APPLY se evale con respecto a cada fila de left_table_source. Esta funcionalidad es til si
right_table_sourcecontiene una funcin con valores de tabla que toma los valores de columna de left_table_source como uno de sus argumentos.
Se debe especificar OUTER o CROSS con APPLY. Si se especifica CROSS, no se genera ninguna fila cuando right_table_sourcese evala con respecto a una fila
especificada de left_table_sourcey se devuelve un conjunto de resultados vaco.
Si se especifica OUTER, se genera una fila para cada fila de left_table_source, incluso si right_table_sourcese evala con respecto a dicha fila y devuelve un
conjunto de resultados vaco.
Para obtener ms informacin, vea la seccin Comentarios.
left_table_source
Es un origen de tabla segn se ha definido en el argumento anterior. Para obtener ms informacin, vea la seccin Comentarios.
right_table_source
Es un origen de tabla segn se ha definido en el argumento anterior. Para obtener ms informacin, vea la seccin Comentarios.
SELECT p. Pr oduct I D, v. Busi nessEnt i t yI D
FROMPr oduct i on. Pr oduct AS p
J OI N Pur chasi ng. Pr oduct Vendor AS v
ON ( p. Pr oduct I D =v. Pr oduct I D) ;
table_source PIVOT <pivot_clause>
Especifica que table_sourcese dinamiza segn pivot_column. table_sourcees una tabla o expresin de tabla. La salida es una tabla que contiene todas las
columnas de table_source, excepto pivot_column y value_column. Las columnas de table_source, excepto pivot_column y value_column, se denominan columnas de
agrupamiento del operador dinmico.
PIVOT realiza una operacin de agrupamiento en la tabla de entrada con respecto a las columnas de agrupamiento y devuelve una fila para cada grupo.
Adems, el resultado contiene una columna para cada valor especificado en column_list que aparece en el parmetro pivot_column de input_table.
Para obtener ms informacin, vea la seccin Comentarios a continuacin.
aggregate_function
Es una funcin de agregado del sistema o definida por el usuario que acepta una o ms entradas. La funcin de agregado no puede variar con respecto a los
valores NULL. Una funcin de agregado invariable con respecto a los valores NULL no tiene en cuenta los valores NULL del grupo mientras evala el valor del
agregado.
No se permite la funcin de agregado del sistema COUNT*.
value_column
Es la columna de valores del operador PIVOT. Si se utiliza con UNPIVOT, value_column no puede ser el nombre de una columna existente en el parmetro
table_source de entrada.
FOR pivot_column
Es la columna dinmica del operador PIVOT. pivot_column debe ser de un tipo que se pueda convertir implcita o explcitamente a nvarchar(). Esta columna no
puede ser image o rowversion.
Si se utiliza UNPIVOT, pivot_column es el nombre de la columna de salida restringida a partir de table_source. No puede haber ninguna columna en table_source
con ese nombre.
IN (column_list )
En la clusula PIVOT, se incluyen los valores de pivot_column que se van a convertir en los nombres de columnas de la tabla de salida. La lista no puede
especificar ningn nombre de columna que ya exista en el parmetro table_sourcede entrada que se est dinamizando.
En la clusula UNPIVOT, se incluyen las columnas de table_source que se va a restringir en una sola pivot_column.
table_alias
Es el nombre de alias de la tabla de salida. pivot_table_alias debe especificarse.
UNPIVOT < unpivot_clause >
Especifica que la tabla de entrada se restringe a partir de varias columnas de column_list en una sola columna denominada pivot_column.
Comentarios
La clusula FROM admite la sintaxis SQL92SQL para las tablas combinadas y las tablas derivadas. La sintaxis SQL92 proporciona los operadores de combinacin
INNER, LEFT OUTER, RIGHT OUTER, FULL OUTER y CROSS.
En las vistas, tablas derivadas y subconsultas se admiten las operaciones UNION y JOIN dentro de una clusula FROM.
Una autocombinacin es una tabla que se combina consigo misma. Las inserciones o actualizaciones basadas en una autocombinacin siguen el orden de la clusula
FROM.
Puesto que SQL Server considera las estadsticas de cardinalidad y distribucin de servidores vinculados que proporcionan estadsticas de distribucin de columnas, no
es necesaria la sugerencia de combinacin REMOTE para exigir la evaluacin de una combinacin de forma remota. El procesador de consultas de SQL Server
considera las estadsticas remotas y determina si es apropiada una estrategia de combinacin remota. La sugerencia de combinacin REMOTE es til para los
proveedores que no proporcionan estadsticas de distribucin de columnas.
Usar APPLY
Los operandos izquierdo y derecho del operador APPLY son expresiones de tabla. La diferencia principal entre estos operandos es que right_table_source puede utilizar
una funcin con valores de tabla que tome una columna de left_table_sourcecomo uno de los argumentos de la funcin. left_table_source puede incluir funciones con
valores de tabla, pero no puede contener argumentos que sean columnas de right_table_source.
El operador APPLY funciona del siguiente modo para generar el origen de tabla para la clusula FROM:
1. Evala right_table_source con respecto a cada fila de left_table_source para generar conjuntos de filas.
Los valores en right_table_source dependen de left_table_source. right_table_source se pueden representar aproximadamente de esta manera:
TVF( l ef t _t abl e_sour ce. r ow) , donde TVF es una funcin con valores de tabla.
2. Combina los conjuntos de resultados generados para cada fila en la evaluacin de right_table_source con left_table_source, mediante una operacin UNION ALL.
La lista de columnas que genera el resultado del operador APPLY es el conjunto de columnas de left_table_source combinado con la lista de columnas de
right_table_source.
Usar PIVOT y UNPIVOT
pivot_column y value_column son columnas de agrupamiento utilizadas por el operador PIVOT. Para obtener el conjunto de resultados de salida, PIVOT aplica el
siguiente proceso:
1. Realiza una operacin GROUP BY en input_table para las columnas de agrupamiento y genera una fila de resultados para cada grupo.
Las columnas de agrupamiento de la fila de salida obtienen los valores de columna correspondientes para dicho grupo en input_table.
2. Genera valores para las columnas de la lista de columnas para cada fila de resultados mediante las siguientes operaciones:
a. Agrupacin adicional de las filas generadas en GROUP BY en el paso anterior para pivot_column.
Para cada columna de salida de column_list, se selecciona un subgrupo que cumple la condicin:
pi vot _col umn =CONVERT( <dat a t ype of pi vot _col umn>, ' out put _col umn' )
b. aggregate_function se evala con respecto a value_column en este subgrupo y su resultado se devuelve como un valor de output_column correspondiente.
Si el subgrupo est vaco, SQL Server genera un valor NULL para output_column. Si la funcin de agregado es COUNT y el subgrupo est vaco, se
devuelve cero (0).
Permisos
Requiere los permisos para la instruccin DELETE, SELECT o UPDATE.
Ejemplos
A.Usar una clusula FROM sencilla
En el siguiente ejemplo se recuperan las columnas Ter r i t or yI Dy Name de la tabla Sal esTer r i t or y de la base de datos de ejemplo AdventureWorks2012.
El conjunto de resultados es el siguiente.
B.Usar las sugerencias del optimizador TABLOCK y HOLDLOCK
En la siguiente transaccin parcial se muestra cmo colocar un bloqueo explcito de tabla compartida en Empl oyee y cmo leer el ndice. El bloqueo se mantiene
durante toda la transaccin.
C.Usar la sintaxis CROSS J OIN de SQL-92
Este ejemplo devuelve el producto resultante de las tablas Empl oyee y Depar t ment de la base de datos AdventureWorks2012. Se devuelve la lista de todas las
combinaciones posibles de las filas de Busi nessEnt i t yI Dy todas las filas con el nombre Depar t ment .
D.Usar la sintaxis FULL OUTER J OIN de SQL-92
En el siguiente ejemplo se devuelve el nombre del producto y los pedidos de venta correspondientes de la tabla Sal esOr der Det ai l de la base de datos
AdventureWorks2012. Adems, se devuelven todos los pedidos de venta que no incluyen ningn producto en la tabla Pr oduct y todos los productos con un pedido de
venta distinto del especificado en la tabla Pr oduct .
SELECT Ter r i t or yI D, Name
FROMSal es. Sal esTer r i t or y
ORDER BY Ter r i t or yI D ;
Ter r i t or yI D Name
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1 Nor t hwest
2 Nor t heast
3 Cent r al
4 Sout hwest
5 Sout heast
6 Canada
7 Fr ance
8 Ger many
9 Aust r al i a
10 Uni t ed Ki ngdom
( 10 r ow( s) af f ect ed)
BEGI N TRAN
SELECT COUNT( *)
FROMHumanResour ces. Empl oyee WI TH ( TABLOCK, HOLDLOCK) ;
SELECT e. Busi nessEnt i t yI D, d. Name AS Depar t ment
FROMHumanResour ces. Empl oyee AS e
CROSS J OI N HumanResour ces. Depar t ment AS d
ORDER BY e. Busi nessEnt i t yI D, d. Name ;
- - The OUTER keywor d f ol l owi ng t he FULL keywor d i s opt i onal .
SELECT p. Name, sod. Sal esOr der I D
FROMPr oduct i on. Pr oduct AS p
Transact-SQL
Transact-SQL
Transact-SQL
E.Usar la sintaxis LEFT FULL OUTER de SQL-92
Este ejemplo combina dos tablas en Pr oduct I Dy mantiene las filas no coincidentes de la tabla izquierda. La tabla Pr oduct coincide con la tabla Sal esOr der Det ai l en
las columnas Pr oduct I Dde cada tabla. Todos los productos, ordenados y no ordenados, aparecen en el conjunto de resultados.
F.Usar la sintaxis INNER J OIN de SQL-92
En el siguiente ejemplo se devuelven todos los nombres de productos e identificadores de pedidos de venta.
G.Usar la sintaxis RIGHT OUTER J OIN de SQL-92
Este ejemplo combina dos tablas en Ter r i t or yI Dy mantiene las filas no coincidentes de la tabla derecha. La tabla Sal esTer r i t or y coincide con la tabla Sal esPer son
en la columna Ter r i t or yI Dde cada tabla. Todos los vendedores aparecen en el conjunto de resultados con independencia de que tengan un territorio asignado.
H.Usar las sugerencias de combinacin HASH y MERGE
En el siguiente ejemplo se realiza una combinacin de tres tablas entre las tablas Pr oduct , Pr oduct Vendor y Vendor para generar una lista de productos y sus
proveedores. El optimizador de consultas combina Pr oduct y Pr oduct Vendor (p y pv mediante una combinacin MERGE. A continuacin, los resultados de la
combinacin MERGE de Pr oduct y Pr oduct Vendor (p y pv) se combinan mediante HASH con la tabla Vendor para generar (p y pv) y v.
Importante
Despus de especificar una sugerencia de combinacin, la palabra clave INNER ya no es opcional y se tiene que incluir explcitamente para hacer combinaciones
INNER JOIN.
I.Usar una tabla derivada
En el siguiente ejemplo se utiliza una tabla derivada y una instruccin SELECT despus de la clusula FROMpara devolver los nombres y apellidos de todos los
empleados y las ciudades en que residen.
FULL OUTER J OI N Sal es. Sal esOr der Det ai l AS sod
ON p. Pr oduct I D =sod. Pr oduct I D
WHERE p. Pr oduct I D I S NULL OR sod. Pr oduct I D I S NULL
ORDER BY p. Name ;
SELECT p. Name, sod. Sal esOr der I D
FROMPr oduct i on. Pr oduct AS p
LEFT OUTER J OI N Sal es. Sal esOr der Det ai l AS sod
ON p. Pr oduct I D =sod. Pr oduct I D
ORDER BY p. Name ;
- - By def aul t , SQL Ser ver per f or ms an I NNER J OI N i f onl y t he J OI N
- - keywor d i s speci f i ed.
SELECT p. Name, sod. Sal esOr der I D
FROMPr oduct i on. Pr oduct AS p
I NNER J OI N Sal es. Sal esOr der Det ai l AS sod
ON p. Pr oduct I D =sod. Pr oduct I D
ORDER BY p. Name ;
SELECT st . Name AS Ter r i t or y, sp. Busi nessEnt i t yI D
FROMSal es. Sal esTer r i t or y AS st
RI GHT OUTER J OI N Sal es. Sal esPer son AS sp
ON st . Ter r i t or yI D =sp. Ter r i t or yI D ;
SELECT p. Name AS Pr oduct Name, v. Name AS Vendor Name
FROMPr oduct i on. Pr oduct AS p
I NNER MERGE J OI N Pur chasi ng. Pr oduct Vendor AS pv
ON p. Pr oduct I D =pv. Pr oduct I D
I NNER HASH J OI N Pur chasi ng. Vendor AS v
ON pv. Busi nessEnt i t yI D =v. Busi nessEnt i t yI D
ORDER BY p. Name, v. Name ;
SELECT RTRI M( p. Fi r st Name) +' ' +LTRI M( p. Last Name) AS Name, d. Ci t y
FROMPer son. Per son AS p
I NNER J OI N HumanResour ces. Empl oyee e ON p. Busi nessEnt i t yI D =e. Busi nessEnt i t yI D
I NNER J OI N
( SELECT bea. Busi nessEnt i t yI D, a. Ci t y
FROMPer son. Addr ess AS a
I NNER J OI N Per son. Busi nessEnt i t yAddr ess AS bea
ON a. Addr essI D =bea. Addr essI D) AS d
ON p. Busi nessEnt i t yI D =d. Busi nessEnt i t yI D
ORDER BY p. Last Name, p. Fi r st Name;
Transact-SQL
Transact-SQL
Transact-SQL
Transact-SQL
Transact-SQL
J .Usar TABLESAMPLE para leer datos de un ejemplo de filas de una tabla
En el siguiente ejemplo se utiliza TABLESAMPLE en la clusula FROMpara devolver aproximadamente el 10 por ciento de todas las filas de la tabla Cust omer .
K.Usar APPLY
En el siguiente ejemplo se da por supuesto que las siguientes tablas con el esquema que se indica existen en la base de datos:
Depar t ment s: Dept I D, Di vi si onI D, Dept Name, Dept Mgr I D
EmpMgr : Mgr I D, EmpI D
Empl oyees: EmpI D, EmpLast Name, EmpFi r st Name, EmpSal ar y
Se incluye adems una funcin con valores de tabla, Get Repor t s( Mgr I D) , que devuelve la lista de todos los empleados (EmpI D, EmpLast Name, EmpSal ar y) que
dependen directa o indirectamente del Mgr I Despecificado.
En el ejemplo se utiliza APPLY para devolver todos los departamentos y todos los empleados de cada departamento. Si un departamento concreto no tiene ningn
empleado, no se devuelve ninguna fila para dicho departamento.
Si desea que la consulta genere filas para los departamentos sin empleados, lo que genera valores NULL para las columnas EmpI D, EmpLast Name y EmpSal ar y, utilice
OUTER APPLY.
L.Usar PIVOT y UNPIVOT
En el siguiente ejemplo se devuelve el nmero de pedidos de compra realizados por los empleados con los identificadores 164, 198, 223, 231 y 233, clasificados en
categoras por identificador de proveedor.
A continuacin se muestra un conjunto de resultados parcial:
Vendor I D Emp1 Emp2 Emp3 Emp4 Emp5
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1 4 3 5 4 4
2 4 1 5 5 5
3 4 3 5 4 4
4 4 2 5 5 4
5 5 1 5 5 5
Para anular la dinamizacin de la tabla, debe dar por supuesto que el conjunto de resultados generado en el ejemplo anterior se almacena como pvt . La consulta sera
la siguiente.
SELECT *
FROMSal es. Cust omer TABLESAMPLE SYSTEM( 10 PERCENT) ;
SELECT Dept I D, Dept Name, Dept Mgr I D, EmpI D, EmpLast Name, EmpSal ar y
FROMDepar t ment s d CROSS APPLY dbo. Get Repor t s( d. Dept Mgr I D) ;
SELECT Dept I D, Dept Name, Dept Mgr I D, EmpI D, EmpLast Name, EmpSal ar y
FROMDepar t ment s d OUTER APPLY dbo. Get Repor t s( d. Dept Mgr I D) ;
SELECT Vendor I D, [ 250] AS Emp1, [ 251] AS Emp2, [ 256] AS Emp3, [ 257] AS Emp4, [ 260] AS Emp5
FROM
( SELECT Pur chaseOr der I D, Empl oyeeI D, Vendor I D
FROMPur chasi ng. Pur chaseOr der Header ) AS p
PI VOT
(
COUNT ( Pur chaseOr der I D)
FOR Empl oyeeI D I N
( [ 250] , [ 251] , [ 256] , [ 257] , [ 260] )
) AS pvt
ORDER BY Vendor I D;
- - Cr eat e t he t abl e and i nser t val ues as por t r ayed i n t he pr evi ous exampl e.
CREATE TABLE dbo. pvt ( Vendor I D i nt , Emp1 i nt , Emp2 i nt ,
Emp3 i nt , Emp4 i nt , Emp5 i nt ) ;
GO
I NSERT I NTO dbo. pvt VALUES
Transact-SQL
Transact-SQL
Transact-SQL
A continuacin se muestra un conjunto de resultados parcial:
Vendor I D Empl oyee Or der s
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1 Emp1 4
1 Emp2 3
1 Emp3 5
1 Emp4 4
1 Emp5 4
2 Emp1 4
2 Emp2 1
2 Emp3 5
2 Emp4 5
2 Emp5 5
M.Usar CROSS APPLY
En el ejemplo siguiente se recupera una instantnea de todos los planes de consulta que residen en la memoria cach del plan mediante una consulta a la vista de
administracin dinmica sys. dm_exec_cached_pl ans para recuperar los identificadores de todos los planes de consulta almacenados en la memoria cach. A
continuacin se especifica el operador CROSS APPLY para pasar los identificadores del plan a sys. dm_exec_quer y_pl an. La salida del plan de presentacin XML de
todos los planes almacenados actualmente en la cach del plan se muestra en la columna quer y_pl an de la tabla devuelta.
Vea tambin
Referencia
CONTAINSTABLE (Transact-SQL)
DELETE (Transact-SQL)
FREETEXTTABLE (Transact-SQL)
INSERT (Transact-SQL)
OPENQUERY (Transact-SQL)
OPENROWSET (Transact-SQL)
Operadores (Transact-SQL)
UPDATE (Transact-SQL)
WHERE (Transact-SQL)
2014 Microsoft
( 1, 4, 3, 5, 4, 4)
, ( 2, 4, 1, 5, 5, 5)
, ( 3, 4, 3, 5, 4, 4)
, ( 4, 4, 2, 5, 5, 4)
, ( 5, 5, 1, 5, 5, 5) ;
GO
- - Unpi vot t he t abl e.
SELECT Vendor I D, Empl oyee, Or der s
FROM
( SELECT Vendor I D, Emp1, Emp2, Emp3, Emp4, Emp5
FROMdbo. pvt ) AS p
UNPI VOT
( Or der s FOR Empl oyee I N
( Emp1, Emp2, Emp3, Emp4, Emp5)
) AS unpvt
GO
USE mast er ;
GO
SELECT dbi d, obj ect _i d, quer y_pl an
FROMsys. dm_exec_cached_pl ans AS cp
CROSS APPLY sys. dm_exec_quer y_pl an( cp. pl an_handl e) ;
GO
Sugerencias (Transact-SQL)
Las sugerencias son opciones o estrategias especificadas para que el procesador de consultas de SQL Server las aplique en instrucciones SELECT, INSERT, UPDATE o
DELETE. Las sugerencias reemplazan a cualquier plan de ejecucin que pueda seleccionar el optimizador de consultas para una consulta.
Advertencia
Puesto que el optimizador de consultas de SQL Server selecciona normalmente el mejor plan de ejecucin para una consulta, se recomienda que las sugerencias
<join_hint>, <query_hint> y <table_hint> solamente se utilicen como ltimo recurso y por parte de programadores y administradores de bases de datos
experimentados.
En esta seccin se describen las sugerencias siguientes:
Sugerencia de combinacin
Sugerencia de consulta
Sugerencia de tabla
2014 Microsoft
SQL Server 2014
INSERT (Transact-SQL)
Agrega una o varias filas a una tabla o una vista en SQL Server. Para obtener ejemplos, vea Ejemplos.
Se aplica a: SQL Server (SQL Server 2008 a versin actual, Windows Azure SQL Database Versin inicial a versin actual).
Convenciones de sintaxis de Transact-SQL
Sintaxis
SQL Server 2014
[ WI TH <common_t abl e_expr essi on>[ , . . . n ] ]
I NSERT
{
[ TOP ( expr essi on ) [ PERCENT ] ]
[ I NTO ]
{ <obj ect >| r owset _f unct i on_l i mi t ed
[ WI TH ( <Tabl e_Hi nt _Li mi t ed>[ . . . n ] ) ]
}
{
[ ( col umn_l i st ) ]
[ <OUTPUT Cl ause>]
{ VALUES ( { DEFAULT | NULL | expr essi on } [ , . . . n ] ) [ , . . . n ]
| der i ved_t abl e
| execut e_st at ement
| <dml _t abl e_sour ce>
| DEFAULT VALUES
}
}
}
[ ; ]
<obj ect >: : =
{
[ ser ver _name . dat abase_name . schema_name .
| dat abase_name . [ schema_name ] .
| schema_name .
]
t abl e_or _vi ew_name
}
<dml _t abl e_sour ce>: : =
SELECT <sel ect _l i st >
FROM( <dml _st at ement _wi t h_out put _cl ause>)
[ AS] t abl e_al i as [ ( col umn_al i as [ , . . . n ] ) ]
[ WHERE <sear ch_condi t i on>]
[ OPTI ON ( <quer y_hi nt >[ , . . . n ] ) ]
- - Ext er nal t ool onl y synt ax
I NSERT
{
[ BULK]
[ dat abase_name . [ schema_name ] . | schema_name . ]
[ t abl e_name | vi ew_name ]
( <col umn_def i ni t i on>)
[ WI TH (
[ [ , ] CHECK_CONSTRAI NTS ]
[ [ , ] FI RE_TRI GGERS ]
[ [ , ] KEEP_NULLS ]
[ [ , ] KI LOBYTES_PER_BATCH =ki l obyt es_per _bat ch ]
[ [ , ] ROWS_PER_BATCH =r ows_per _bat ch ]
[ [ , ] ORDER ( { col umn [ ASC | DESC ] } [ , . . . n ] ) ]
[ [ , ] TABLOCK ]
) ]
}
[ ; ] <col umn_def i ni t i on>: : =
col umn_name <dat a_t ype>
[ COLLATE col l at i on_name ]
[ NULL | NOT NULL ]
<dat a t ype>: : =
[ t ype_schema_name . ] t ype_name
[ ( pr eci si on [ , scal e ] | max ]
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
Se aplica a: SQL Server 2008 a SQL Server 2014.
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_namepueden 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
Se aplica a: SQL Server 2008 a SQL Server 2014.
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_namedebe 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
Se aplica a: SQL Server 2008 a SQL Server 2014.
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, REPEATABLEREAD o UPDLOCK en tablas que son destinos de
instrucciones INSERT se quitar en una versin futura de SQL Server. Estas sugerencias no influyen en el rendimiento de las instrucciones INSERT. Evite el uso
de dichas sugerencias en los nuevos trabajos de desarrollo y piense 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 TransactSQL 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 principalclave 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 TransactSQL.
<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 cuenta los cambios realizados en ellos 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 TransactSQL. 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
Se aplica a: SQL Server 2008 a SQL Server 2014.
Hace que la nueva fila contenga los valores predeterminados definidos para cada columna.
BULK
Se aplica a: SQL Server 2008 a SQL Server 2014.
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
Se aplica a: SQL Server 2008 a SQL Server 2014.
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
Se aplica a: SQL Server 2008 a SQL Server 2014.
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
Se aplica a: SQL Server 2008 a SQL Server 2014.
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
Se aplica a: SQL Server 2008 a SQL Server 2014.
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
Operacin predeterminada
char Rellena el valor con espacios hasta el ancho definido de la columna.
varchar Quita los espacios finales hasta el ltimo carcter distinto de espacio o hasta un carcter de espacio nico para las cadenas compuestas
solamente de espacios.
varbinary Quita los ceros finales.
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-xxxx-xxxx-xxxx-xxxxxxxxxxxx (36 caracteres
incluidos los guiones, donde xes un dgito hexadecimal de los intervalos 09 o af 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 Poi nt mediante la conversin explcita a
partir de una cadena.
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
Cr eat eNewPoi nt ( ) definida por el usuario para crear un valor nuevo del tipo Poi nt definido por el usuario e insertar el valor en la tabla Ci t i es.
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.
I NSERT I NTO Ci t i es ( Locat i on)
VALUES ( CONVERT( Poi nt , ' 12. 3: 46. 2' ) ) ;
I NSERT I NTO Ci t i es ( Locat i on)
VALUES ( dbo. Cr eat eNewPoi nt ( x, y) ) ;
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 utilizando sp_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 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.
Para ejecutar INSERT con la opcin BULK de la funcin OPENROWSET, debe ser miembro del rol fijo de servidor sysadmin o bulkadmin.
Ejemplos
Categora Elementos de sintaxis ofrecidos
Sintaxis bsica INSERT constructor con valores de tabla
Tratar los valores de columna IDENTITY NEWID valores predeterminados tipos definidos por el usuario
Insertar datos de otras tablas INSERTSELECT INSERTEXECUTE WITH expresin de tabla comn TOP OFFSET
FETCH
Especificar objetos de destino que no sean tablas estndar Vistas variables de tabla
Insertar filas en una tabla remota Servidor vinculado funcin de conjunto de filas OPENQUERY funcin de conjunto de
filas OPENDATASOURCE
Cargar datos de forma masiva de tablas o archivos de datos INSERTSELECT funcin OPENROWSET
Invalidar el comportamiento predeterminado del optimizador de consultas
mediante sugerencias
Sugerencias de tabla
Capturar los resultados de la instruccin INSERT 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 Pr oduct i on. Uni t Measur e en la base de datos AdventureWorks2012. Las columnas de esta tabla son
Uni t Measur eCode, Name y Modi f i edDat e. 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.
I NSERT I NTO Pr oduct i on. Uni t Measur e
VALUES ( N' FT' , N' Feet ' , ' 20080414' ) ;
B.Insertar varias filas de datos
En el ejemplo siguiente se usa el constructor de valores de tabla para insertar tres filas en la tabla Pr oduct i on. Uni t Measur e de la base de datos AdventureWorks2012
en una sola 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.
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
Pr oduct i on. Uni t Measur e en la base de datos AdventureWorks2012 es, Uni t Measur eCode, Name, Modi f i edDat e; no obstante, las columnas no se incluyen en dicho
orden en column_list.
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. Col umn_1
es una columna calculada que genera automticamente un valor concatenando una cadena con el valor insertado en col umn_2. Col umn_2 se define con una restriccin
predeterminada. Si no se especifica un valor para esta columna, se usar el valor predeterminado. Col umn_3 se define con el tipo de datos rowversion, que genera
automticamente un nmero binario nico que se incrementa. Col umn_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.
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.
I NSERT I NTO Pr oduct i on. Uni t Measur e
VALUES ( N' FT2' , N' Squar e Feet ' , ' 20080923' ) , ( N' Y' , N' Yar ds' , ' 20080923' ) , ( N' Y3' , N' Cubi c Yar ds' , ' 20080923' ) ;
I NSERT I NTO Pr oduct i on. Uni t Measur e ( Name, Uni t Measur eCode,
Modi f i edDat e)
VALUES ( N' Squar e Yar ds' , N' Y2' , GETDATE( ) ) ;
I F OBJ ECT_I D ( ' dbo. T1' , ' U' ) I S NOT NULL
DROP TABLE dbo. T1;
GO
CREATE TABLE dbo. T1
(
col umn_1 AS ' Comput ed col umn ' +col umn_2,
col umn_2 var char ( 30)
CONSTRAI NT def aul t _name DEFAULT ( ' my col umn def aul t ' ) ,
col umn_3 r owver si on,
col umn_4 var char ( 40) NULL
) ;
GO
I NSERT I NTO dbo. T1 ( col umn_4)
VALUES ( ' Expl i ci t val ue' ) ;
I NSERT I NTO dbo. T1 ( col umn_2, col umn_4)
VALUES ( ' Expl i ci t val ue' , ' Expl i ci t val ue' ) ;
I NSERT I NTO dbo. T1 ( col umn_2)
VALUES ( ' Expl i ci t val ue' ) ;
I NSERT I NTO T1 DEFAULT VALUES;
GO
SELECT col umn_1, col umn_2, col umn_3, col umn_4
FROMdbo. T1;
GO
I F OBJ ECT_I D ( ' dbo. T1' , ' U' ) I S NOT NULL
DROP TABLE dbo. T1;
GO
CREATE TABLE dbo. T1 ( col umn_1 i nt I DENTI TY, col umn_2 VARCHAR( 30) ) ;
GO
I NSERT T1 VALUES ( ' Row #1' ) ;
I NSERT T1 ( col umn_2) VALUES ( ' Row #2' ) ;
GO
SET I DENTI TY_I NSERT T1 ON;
GO
I NSERT I NTO T1 ( col umn_1, col umn_2)
VALUES ( - 99, ' Expl i ci t i dent i t y val ue' ) ;
GO
SELECT col umn_1, col umn_2
FROMT1;
GO
C.Insertar datos en una columna uniqueidentifier mediante NEWID()
En el siguiente ejemplo se utiliza la funcin NEWID() para obtener un GUID para col umn_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 I NSERT.
D.Insertar datos en columnas de tipo definido por el usuario
Las siguientes instrucciones de Transact-SQL insertan tres filas en la columna Poi nt Val ue de la tabla Poi nt s. Esta columna usa un tipo definido por el usuario CLR
(UDT). El tipo de datos Poi nt 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 Poi nt . Las dos primeras instrucciones utilizan la funcin CONVERT para convertir un valor de cadena al tipo
Poi nt y la tercera utiliza la funcin CAST. Para obtener ms informacin, vea Manipular datos UDT.
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 Empl oyee, Sal esPer son y Per son) en la base de datos
AdventureWorks2012 y almacenar el conjunto de resultados en la tabla Empl oyeeSal es . 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.
I F OBJ ECT_I D ( ' dbo. T1' , ' U' ) I S NOT NULL
DROP TABLE dbo. T1;
GO
CREATE TABLE dbo. T1
(
col umn_1 i nt I DENTI TY,
col umn_2 uni quei dent i f i er ,
) ;
GO
I NSERT I NTO dbo. T1 ( col umn_2)
VALUES ( NEWI D( ) ) ;
I NSERT I NTO T1 DEFAULT VALUES;
GO
SELECT col umn_1, col umn_2
FROMdbo. T1;
I NSERT I NTO dbo. Poi nt s ( Poi nt Val ue) VALUES ( CONVERT( Poi nt , ' 3, 4' ) ) ;
I NSERT I NTO dbo. Poi nt s ( Poi nt Val ue) VALUES ( CONVERT( Poi nt , ' 1, 5' ) ) ;
I NSERT I NTO dbo. Poi nt s ( Poi nt Val ue) VALUES ( CAST ( ' 1, 99' AS Poi nt ) ) ;
I F OBJ ECT_I D ( ' dbo. Empl oyeeSal es' , ' U' ) I S NOT NULL
DROP TABLE dbo. Empl oyeeSal es;
GO
I F OBJ ECT_I D ( ' dbo. uspGet Empl oyeeSal es' , ' P' ) I S NOT NULL
DROP PROCEDURE uspGet Empl oyeeSal es;
GO
CREATE TABLE dbo. Empl oyeeSal es
( Dat aSour ce var char ( 20) NOT NULL,
Busi nessEnt i t yI D var char ( 11) NOT NULL,
Last Name var char ( 40) NOT NULL,
Sal esDol l ar s money NOT NULL
) ;
GO
CREATE PROCEDURE dbo. uspGet Empl oyeeSal es
AS
SET NOCOUNT ON;
SELECT ' PROCEDURE' , sp. Busi nessEnt i t yI D, c. Last Name,
sp. Sal esYTD
FROMSal es. Sal esPer son AS sp
I NNER J OI N Per son. Per son AS c
ON sp. Busi nessEnt i t yI D =c. Busi nessEnt i t yI D
WHERE sp. Busi nessEnt i t yI D LI KE ' 2%'
ORDER BY sp. Busi nessEnt i t yI D, c. Last Name;
GO
- - I NSERT. . . SELECT exampl e
I NSERT I NTO dbo. Empl oyeeSal es
SELECT ' SELECT' , sp. Busi nessEnt i t yI D, c. Last Name, sp. Sal esYTD
FROMSal es. Sal esPer son AS sp
I NNER J OI N Per son. Per son AS c
ON sp. Busi nessEnt i t yI D =c. Busi nessEnt i t yI D
WHERE sp. Busi nessEnt i t yI D LI KE ' 2%'
ORDER BY sp. Busi nessEnt i t yI D, c. Last Name;
GO
- - I NSERT. . . EXECUTE pr ocedur e exampl e
I NSERT I NTO dbo. Empl oyeeSal es
B.Usar la expresin de tabla comn WITH para definir los datos insertados
En el siguiente ejemplo se crea la tabla NewEmpl oyee en la base de datos AdventureWorks2012. Una expresin de tabla comn Empl oyeeTemp) define las filas de una o
varias tablas que se van a insertar en la tabla NewEmpl oyee. La instruccin INSERT hace referencia a las columnas de la expresin de tabla comn.
C.Usar TOP para limitar los datos insertados de la tabla de origen
En el siguiente ejemplo se crea la tabla Empl oyeeSal es y se insertan el nombre y los datos de ventas del ao hasta la fecha para los primeros 5 empleados aleatorios
de la tabla HumanResour ces. Empl oyee en la base de datos AdventureWorks2012. 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 Empl oyeeSal es. Observe que la clusula ORDER BY de la instruccin SELECT no se utiliza para
determinar los primeros 5 empleados.
EXECUTE dbo. uspGet Empl oyeeSal es;
GO
- - I NSERT. . . EXECUTE( ' st r i ng' ) exampl e
I NSERT I NTO dbo. Empl oyeeSal es
EXECUTE
( '
SELECT ' ' EXEC STRI NG' ' , sp. Busi nessEnt i t yI D, c. Last Name,
sp. Sal esYTD
FROMSal es. Sal esPer son AS sp
I NNER J OI N Per son. Per son AS c
ON sp. Busi nessEnt i t yI D =c. Busi nessEnt i t yI D
WHERE sp. Busi nessEnt i t yI D LI KE ' ' 2%' '
ORDER BY sp. Busi nessEnt i t yI D, c. Last Name
' ) ;
GO
- - Show r esul t s.
SELECT Dat aSour ce, Busi nessEnt i t yI D, Last Name, Sal esDol l ar s
FROMdbo. Empl oyeeSal es;
I F OBJ ECT_I D ( N' HumanResour ces. NewEmpl oyee' , N' U' ) I S NOT NULL
DROP TABLE HumanResour ces. NewEmpl oyee;
GO
CREATE TABLE HumanResour ces. NewEmpl oyee
(
Empl oyeeI D i nt NOT NULL,
Last Name nvar char ( 50) NOT NULL,
Fi r st Name nvar char ( 50) NOT NULL,
PhoneNumber Phone NULL,
Addr essLi ne1 nvar char ( 60) NOT NULL,
Ci t y nvar char ( 30) NOT NULL,
St at e nchar ( 3) NOT NULL,
Post al Code nvar char ( 15) NOT NULL,
Cur r ent Fl ag Fl ag
) ;
GO
WI TH Empl oyeeTemp ( EmpI D, Last Name, Fi r st Name, Phone,
Addr ess, Ci t y, St at ePr ovi nce,
Post al Code, Cur r ent Fl ag)
AS ( SELECT
e. Busi nessEnt i t yI D, c. Last Name, c. Fi r st Name, pp. PhoneNumber ,
a. Addr essLi ne1, a. Ci t y, sp. St at ePr ovi nceCode,
a. Post al Code, e. Cur r ent Fl ag
FROMHumanResour ces. Empl oyee e
I NNER J OI N Per son. Busi nessEnt i t yAddr ess AS bea
ON e. Busi nessEnt i t yI D =bea. Busi nessEnt i t yI D
I NNER J OI N Per son. Addr ess AS a
ON bea. Addr essI D =a. Addr essI D
I NNER J OI N Per son. Per sonPhone AS pp
ON e. Busi nessEnt i t yI D =pp. Busi nessEnt i t yI D
I NNER J OI N Per son. St at ePr ovi nce AS sp
ON a. St at ePr ovi nceI D =sp. St at ePr ovi nceI D
I NNER J OI N Per son. Per son as c
ON e. Busi nessEnt i t yI D =c. Busi nessEnt i t yI D
)
I NSERT I NTO HumanResour ces. NewEmpl oyee
SELECT EmpI D, Last Name, Fi r st Name, Phone,
Addr ess, Ci t y, St at ePr ovi nce, Post al Code, Cur r ent Fl ag
FROMEmpl oyeeTemp;
GO
I F OBJ ECT_I D ( ' dbo. Empl oyeeSal es' , ' U' ) I S NOT NULL
DROP TABLE dbo. Empl oyeeSal es;
GO
CREATE TABLE dbo. Empl oyeeSal es
( Empl oyeeI D nvar char ( 11) NOT NULL,
Last Name nvar char ( 20) NOT NULL,
Fi r st Name nvar char ( 20) NOT NULL,
Year l ySal es money NOT NULL
) ;
GO
I NSERT TOP( 5) I NTO dbo. Empl oyeeSal es
OUTPUT i nser t ed. Empl oyeeI D, i nser t ed. Fi r st Name, i nser t ed. Last Name, i nser t ed. Year l ySal es
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 Empl oyeeSal es. Observe que los primeros 5 empleados se insertan
ahora segn los resultados de la clusula ORDER BY en lugar de las filas aleatorias.
Especificar objetos de destino que no sean tablas estndar
En los ejemplos de esta seccin se muestra cmo insertar filas especificando una variable de tabla o vista.
A.Insertar datos especificando una 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 I NSERT debe coincidir con el orden de las columnas de la vista. Para obtener ms informacin, vea Modificar datos mediante una vista.
B.Insertar datos en una variable de tabla
En el siguiente ejemplo se especifica una variable de tabla como el objeto de destino en la base de datos AdventureWorks2012.
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, MyLi nkSer ver , se especifica entonces como parte del nombre de objeto de cuatro partes en el formato server.catalog.schema.object.
SELECT sp. Busi nessEnt i t yI D, c. Last Name, c. Fi r st Name, sp. Sal esYTD
FROMSal es. Sal esPer son AS sp
I NNER J OI N Per son. Per son AS c
ON sp. Busi nessEnt i t yI D =c. Busi nessEnt i t yI D
WHERE sp. Sal esYTD >250000. 00
ORDER BY sp. Sal esYTD DESC;
I NSERT I NTO dbo. Empl oyeeSal es
OUTPUT i nser t ed. Empl oyeeI D, i nser t ed. Fi r st Name, i nser t ed. Last Name, i nser t ed. Year l ySal es
SELECT TOP ( 5) sp. Busi nessEnt i t yI D, c. Last Name, c. Fi r st Name, sp. Sal esYTD
FROMSal es. Sal esPer son AS sp
I NNER J OI N Per son. Per son AS c
ON sp. Busi nessEnt i t yI D =c. Busi nessEnt i t yI D
WHERE sp. Sal esYTD >250000. 00
ORDER BY sp. Sal esYTD DESC;
I F OBJ ECT_I D ( ' dbo. T1' , ' U' ) I S NOT NULL
DROP TABLE dbo. T1;
GO
I F OBJ ECT_I D ( ' dbo. V1' , ' V' ) I S NOT NULL
DROP VI EWdbo. V1;
GO
CREATE TABLE T1 ( col umn_1 i nt , col umn_2 var char ( 30) ) ;
GO
CREATE VI EWV1 AS
SELECT col umn_2, col umn_1
FROMT1;
GO
I NSERT I NTO V1
VALUES ( ' Row 1' , 1) ;
GO
SELECT col umn_1, col umn_2
FROMT1;
GO
SELECT col umn_1, col umn_2
FROMV1;
GO
- - Cr eat e t he t abl e var i abl e.
DECLARE @MyTabl eVar t abl e(
Locat i onI D i nt NOT NULL,
Cost Rat e smal l money NOT NULL,
NewCost Rat e AS Cost Rat e * 1. 5,
Modi f i edDat e dat et i me) ;
- - I nser t val ues i nt o t he t abl e var i abl e.
I NSERT I NTO @MyTabl eVar ( Locat i onI D, Cost Rat e, Modi f i edDat e)
SELECT Locat i onI D, Cost Rat e, GETDATE( ) FROMPr oduct i on. Locat i on
WHERE Cost Rat e >0;
- - Vi ew t he t abl e var i abl e r esul t set .
SELECT * FROM@MyTabl eVar ;
GO
Se aplica a: SQL Server 2008 a SQL Server 2014.
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.
Se aplica a: SQL Server 2008 a SQL Server 2014.
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.
Se aplica a: SQL Server 2008 a SQL Server 2014.
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 Advent ur eWor ks2012 est establecido en FULL. Para asegurarse de que se utiliza el registro mnimo, el modelo de recuperacin de la
base de datos Advent ur eWor ks2012 se establece en BULK_LOGGED antes de que las filas se inserten y se restablece en FULL despus de la instruccin INSERT INTO
SELECT. Adems, se especifica la sugerencia TABLOCK para la tabla de destino Sal es. Sal esHi st or y. Esto asegura que la instruccin use el espacio mnimo en el
registro de transacciones y funcione eficazmente.
USE mast er ;
GO
- - Cr eat e a l i nk t o t he r emot e dat a sour ce.
- - Speci f y a val i d ser ver name f or @dat asr c as ' ser ver _name' or ' ser ver _name\ i nst ance_name' .
EXEC sp_addl i nkedser ver @ser ver =N' MyLi nkSer ver ' ,
@sr vpr oduct =N' ' ,
@pr ovi der =N' SQLNCLI ' ,
@dat asr c =N' ser ver _name' ,
@cat al og =N' Advent ur eWor ks2012' ;
GO
- - Speci f y t he r emot e dat a sour ce i n t he FROMcl ause usi ng a f our - par t name
- - i n t he f or ml i nked_ser ver . cat al og. schema. obj ect .
I NSERT I NTO MyLi nkSer ver . Advent ur eWor ks2012. HumanResour ces. Depar t ment ( Name, Gr oupName)
VALUES ( N' Publ i c Rel at i ons' , N' Execut i ve Gener al and Admi ni st r at i on' ) ;
GO
I NSERT OPENQUERY ( MyLi nkSer ver , ' SELECT Name, Gr oupName FROMAdvent ur eWor ks2012. HumanResour ces. Depar t ment ' )
VALUES ( ' Envi r onment al I mpact ' , ' Engi neer i ng' ) ;
GO
- - Use t he OPENDATASOURCE f unct i on t o speci f y t he r emot e dat a sour ce.
- - Speci f y a val i d ser ver name f or Dat a Sour ce usi ng t he f or mat ser ver _name or ser ver _name\ i nst ance_name.
I NSERT I NTO OPENDATASOURCE( ' SQLNCLI ' ,
' Dat a Sour ce=<ser ver _name>; I nt egr at ed Secur i t y=SSPI ' )
. Advent ur eWor ks2012. HumanResour ces. Depar t ment ( Name, Gr oupName)
VALUES ( N' St andar ds and Met hods' , ' Qual i t y Assur ance' ) ;
GO
- - Cr eat e t he t ar get heap.
CREATE TABLE Sal es. Sal esHi st or y(
Sal esOr der I D i nt NOT NULL,
Sal esOr der Det ai l I D i nt NOT NULL,
Car r i er Tr acki ngNumber nvar char ( 25) NULL,
Or der Qt y smal l i nt NOT NULL,
Pr oduct I D i nt NOT NULL,
Speci al Of f er I D i nt NOT NULL,
Uni t Pr i ce money NOT NULL,
Uni t Pr i ceDi scount money NOT NULL,
Li neTot al money NOT NULL,
r owgui d uni quei dent i f i er ROWGUI DCOL NOT NULL,
Modi f i edDat e dat et i me NOT NULL ) ;
GO
- - Tempor ar i l y set t he r ecover y model t o BULK_LOGGED.
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).
Se aplica a: SQL Server 2008 a SQL Server 2014.
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 consulta, se recomienda que nicamente los administradores
de bases de datos y desarrolladores experimentados utilicen las sugerencias como ltimo recurso.
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.
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 Scr apReason y se utiliza la clusula OUTPUT para devolver los resultados de la instruccin a la variable de la tabla
@MyTabl eVar . Dado que la columna Scr apReasonI Dse define con una propiedad I DENTI TY, no se especifica ningn valor en la instruccin I NSERT 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 columna
I NSERTED. Scr apReasonI D.
ALTER DATABASE Advent ur eWor ks2012
SET RECOVERY BULK_LOGGED;
GO
- - Tr ansf er dat a f r omSal es. Sal esOr der Det ai l t o Sal es. Sal esHi st or y
I NSERT I NTO Sal es. Sal esHi st or y WI TH ( TABLOCK)
( Sal esOr der I D,
Sal esOr der Det ai l I D,
Car r i er Tr acki ngNumber ,
Or der Qt y,
Pr oduct I D,
Speci al Of f er I D,
Uni t Pr i ce,
Uni t Pr i ceDi scount ,
Li neTot al ,
r owgui d,
Modi f i edDat e)
SELECT * FROMSal es. Sal esOr der Det ai l ;
GO
- - Reset t he r ecover y model .
ALTER DATABASE Advent ur eWor ks2012
SET RECOVERY FULL;
GO
- - Use t he OPENROWSET f unct i on t o speci f y t he dat a sour ce and speci f i es t he I GNORE_TRI GGERS t abl e hi nt .
I NSERT I NTO HumanResour ces. Depar t ment WI TH ( I GNORE_TRI GGERS) ( Name, Gr oupName)
SELECT b. Name, b. Gr oupName
FROMOPENROWSET (
BULK ' C: \ SQLFi l es\ Depar t ment Dat a. t xt ' ,
FORMATFI LE =' C: \ SQLFi l es\ Bul kl oadFor mat Fi l e. xml ' ,
ROWS_PER_BATCH =15000) AS b ;
I NSERT I NTO Pr oduct i on. Locat i on WI TH ( XLOCK)
( Name, Cost Rat e, Avai l abi l i t y)
VALUES ( N' Fi nal I nvent or y' , 15. 00, 80. 00) ;
DECLARE @MyTabl eVar t abl e( NewScr apReasonI D smal l i nt ,
Name var char ( 50) ,
Modi f i edDat e dat et i me) ;
I NSERT Pr oduct i on. Scr apReason
OUTPUT I NSERTED. Scr apReasonI D, I NSERTED. Name, I NSERTED. Modi f i edDat e
I NTO @MyTabl eVar
VALUES ( N' Oper at or er r or ' , GETDATE( ) ) ;
- - Di spl ay t he r esul t set of t he t abl e var i abl e.
SELECT NewScr apReasonI D, Name, Modi f i edDat e FROM@MyTabl eVar ;
- - Di spl ay t he r esul t set of t he t abl e.
B.Usar OUTPUT con columnas de identidad y calculadas
En el siguiente ejemplo se crea la tabla Empl oyeeSal es 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 Empl oyeeSal es contiene una columna de identidad (Empl oyeeI D) y una columna calculada (Pr oj ect edSal es).
Puesto que Motor de base de datos genera estos valores durante la operacin de insercin, ninguna de estas columnas se puede definir en @MyTabl eVar .
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 Quant i t y de la tabla Pr oduct I nvent or y, en funcin de los pedidos procesados en la tabla Sal esOr der Det ai l de la base de datos
AdventureWorks2012. 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, Zer oI nvent or y, que realiza el seguimiento de los productos sin existencias.
Vea tambin
SELECT Scr apReasonI D, Name, Modi f i edDat e
FROMPr oduct i on. Scr apReason;
I F OBJ ECT_I D ( ' dbo. Empl oyeeSal es' , ' U' ) I S NOT NULL
DROP TABLE dbo. Empl oyeeSal es;
GO
CREATE TABLE dbo. Empl oyeeSal es
( Empl oyeeI D i nt I DENTI TY ( 1, 5) NOT NULL,
Last Name nvar char ( 20) NOT NULL,
Fi r st Name nvar char ( 20) NOT NULL,
Cur r ent Sal es money NOT NULL,
Pr oj ect edSal es AS Cur r ent Sal es * 1. 10
) ;
GO
DECLARE @MyTabl eVar t abl e(
Last Name nvar char ( 20) NOT NULL,
Fi r st Name nvar char ( 20) NOT NULL,
Cur r ent Sal es money NOT NULL
) ;
I NSERT I NTO dbo. Empl oyeeSal es ( Last Name, Fi r st Name, Cur r ent Sal es)
OUTPUT I NSERTED. Last Name,
I NSERTED. Fi r st Name,
I NSERTED. Cur r ent Sal es
I NTO @MyTabl eVar
SELECT c. Last Name, c. Fi r st Name, sp. Sal esYTD
FROMSal es. Sal esPer son AS sp
I NNER J OI N Per son. Per son AS c
ON sp. Busi nessEnt i t yI D =c. Busi nessEnt i t yI D
WHERE sp. Busi nessEnt i t yI D LI KE ' 2%'
ORDER BY c. Last Name, c. Fi r st Name;
SELECT Last Name, Fi r st Name, Cur r ent Sal es
FROM@MyTabl eVar ;
GO
SELECT Empl oyeeI D, Last Name, Fi r st Name, Cur r ent Sal es, Pr oj ect edSal es
FROMdbo. Empl oyeeSal es;
I F OBJ ECT_I D( N' Pr oduct i on. Zer oI nvent or y' , N' U' ) I S NOT NULL
DROP TABLE Pr oduct i on. Zer oI nvent or y;
GO
- - Cr eat e Zer oI nvent or y t abl e.
CREATE TABLE Pr oduct i on. Zer oI nvent or y ( Del et edPr oduct I D i nt , RemovedOnDat e Dat eTi me) ;
GO
I NSERT I NTO Pr oduct i on. Zer oI nvent or y ( Del et edPr oduct I D, RemovedOnDat e)
SELECT Pr oduct I D, GETDATE( )
FROM
( MERGE Pr oduct i on. Pr oduct I nvent or y AS pi
USI NG ( SELECT Pr oduct I D, SUM( Or der Qt y) FROMSal es. Sal esOr der Det ai l AS sod
J OI N Sal es. Sal esOr der Header AS soh
ON sod. Sal esOr der I D =soh. Sal esOr der I D
AND soh. Or der Dat e =' 20070401'
GROUP BY Pr oduct I D) AS sr c ( Pr oduct I D, Or der Qt y)
ON ( pi . Pr oduct I D =sr c. Pr oduct I D)
WHEN MATCHED AND pi . Quant i t y - sr c. Or der Qt y <=0
THEN DELETE
WHEN MATCHED
THEN UPDATE SET pi . Quant i t y =pi . Quant i t y - sr c. Or der Qt y
OUTPUT $act i on, del et ed. Pr oduct I D) AS Changes ( Act i on, Pr oduct I D)
WHERE Act i on =' DELETE' ;
I F @@ROWCOUNT =0
PRI NT ' War ni ng: No r ows wer e i nser t ed' ;
GO
SELECT Del et edPr oduct I D, RemovedOnDat e FROMPr oduct i on. Zer oI nvent or y;
Referencia
BULK INSERT (Transact-SQL)
DELETE (Transact-SQL)
EXECUTE (Transact-SQL)
FROM (Transact-SQL)
IDENTITY (propiedad de Transact-SQL)
NEWID (Transact-SQL)
SELECT (Transact-SQL)
UPDATE (Transact-SQL)
MERGE (Transact-SQL)
OUTPUT clusula de TransactSQL
Conceptos
Usar las tablas insertadas y eliminadas
2014 Microsoft
MERGE (Transact-SQL)
Realiza operaciones de insercin, actualizacin o eliminacin en una tabla de destino segn los resultados de una combinacin con una tabla de origen. Por ejemplo,
puede sincronizar dos tablas insertando, actualizando o eliminando las filas de una tabla segn las diferencias que se encuentren en la otra.
Se aplica a: SQL Server (desde SQL Server 2008 hasta la versin actual, Windows Azure SQL Database desde la versin inicial hasta la versin actual).
Convenciones de sintaxis de Transact-SQL
Sintaxis
SQL Server 2014
[ WI TH <common_t abl e_expr essi on>[ , . . . n] ]
MERGE
[ TOP ( expr essi on ) [ PERCENT ] ]
[ I NTO ] <t ar get _t abl e>[ WI TH ( <mer ge_hi nt >) ] [ [ AS ] t abl e_al i as ]
USI NG <t abl e_sour ce>
ON <mer ge_sear ch_condi t i on>
[ WHEN MATCHED [ AND <cl ause_sear ch_condi t i on>]
THEN <mer ge_mat ched>] [ . . . n ]
[ WHEN NOT MATCHED [ BY TARGET ] [ AND <cl ause_sear ch_condi t i on>]
THEN <mer ge_not _mat ched>]
[ WHEN NOT MATCHED BY SOURCE [ AND <cl ause_sear ch_condi t i on>]
THEN <mer ge_mat ched>] [ . . . n ]
[ <out put _cl ause>]
[ OPTI ON ( <quer y_hi nt >[ , . . . n ] ) ]
;
<t ar get _t abl e>: : =
{
[ dat abase_name . schema_name . | schema_name . ]
t ar get _t abl e
}
<mer ge_hi nt >: : =
{
{ [ <t abl e_hi nt _l i mi t ed>[ , . . . n ] ]
[ [ , ] I NDEX ( i ndex_val [ , . . . n ] ) ] }
}
<t abl e_sour ce>: : =
{
t abl e_or _vi ew_name [ [ AS ] t abl e_al i as ] [ <t abl esampl e_cl ause>]
[ WI TH ( t abl e_hi nt [ [ , ] . . . n ] ) ]
| r owset _f unct i on [ [ AS ] t abl e_al i as ]
[ ( bul k_col umn_al i as [ , . . . n ] ) ]
| user _def i ned_f unct i on [ [ AS ] t abl e_al i as ]
| OPENXML <openxml _cl ause>
| der i ved_t abl e [ AS ] t abl e_al i as [ ( col umn_al i as [ , . . . n ] ) ]
| <j oi ned_t abl e>
| <pi vot ed_t abl e>
| <unpi vot ed_t abl e>
}
<mer ge_sear ch_condi t i on>: : =
<sear ch_condi t i on>
<mer ge_mat ched>: : =
{ UPDATE SET <set _cl ause>| DELETE }
<set _cl ause>: : =
SET
{ col umn_name ={ expr essi on | DEFAULT | NULL }
| { udt _col umn_name. { { pr oper t y_name =expr essi on
| f i el d_name =expr essi on }
| met hod_name ( ar gument [ , . . . n ] ) }
}
| col umn_name { . WRI TE ( expr essi on , @Of f set , @Lengt h ) }
| @var i abl e =expr essi on
| @var i abl e =col umn =expr essi on
| col umn_name { +=| - =| *=| / =| %=| &=| ^=| | =} expr essi on
| @var i abl e { +=| - =| *=| / =| %=| &=| ^=| | =} expr essi on
| @var i abl e =col umn { +=| - =| *=| / =| %=| &=| ^=| | =} expr essi on
} [ , . . . n ]
<mer ge_not _mat ched>: : =
{
I NSERT [ ( col umn_l i st ) ]
{ VALUES ( val ues_l i st )
| DEFAULT VALUES }
Argumentos
WITH <common_table_expression>
Especifica la vista o el conjunto de resultados temporal indicado, que tambin se conoce como expresin de tabla comn, definido en el mbito de la instruccin
MERGE. El conjunto de resultados se deriva de una consulta simple. La instruccin MERGE hace referencia al conjunto de resultados. Para obtener ms
informacin, vea WITH common_table_expression (Transact-SQL).
TOP ( expression ) [ PERCENT ]
Especifica el nmero o porcentaje de filas afectadas. expression puede ser un nmero o un porcentaje de filas. Las filas a las que se hace referencia en la
expresin TOP no estn organizadas en ningn orden. Para obtener ms informacin, vea TOP (Transact-SQL).
La clusula TOP se aplica despus de que se combinen toda la tabla de origen y toda la tabla de destino, y se quiten las filas combinadas que no renan las
condiciones para las acciones de insercin, actualizacin o eliminacin. La clusula TOP reduce an ms el nmero de filas combinadas al valor especificado y se
aplican las acciones de insercin, actualizacin o eliminacin a las filas combinadas restantes de una manera desordenada. Es decir, no hay ningn orden en el
que las filas se distribuyan entre las acciones definidas en las clusulas WHEN. Por ejemplo, cuando se especifica TOP (10) afecta a 10 filas; de estas filas, 7 se
pueden actualizar y 3 insertar, o se pueden eliminar 1, actualizar 5 e insertar 4, etc.
Dado que la instruccin MERGE realiza un recorrido completo de ambas tablas, de destino y de origen, el rendimiento de E/S puede verse afectado al utilizar la
clusula TOP para modificar una tabla grande mediante la creacin de varios lotes. En este escenario, es importante asegurase de que todos los lotes sucesivos
tengan como destino nuevas filas.
database_name
Es el nombre de la base de datos donde se encuentra target_table.
schema_name
Es el nombre del esquema al que pertenece target_table.
target_table
Es la tabla o la vista con la que las filas de datos de <table_source> se hacen coincidir segn la <clause_search_condition>. target_table es el destino de las
operaciones de insercin, actualizacin o eliminacin que las clusulas WHEN de la instruccin MERGE especifican.
Si target_tablees una vista, cualquier accin con ella debe satisfacer las condiciones para actualizar las vistas. Para obtener ms informacin, vea Modificar datos
mediante una vista.
target_table no puede ser una tabla remota. target_table no puede tener ninguna regla definida.
[ AS ] table_alias
Es un nombre alternativo que se utiliza para hacer referencia a una tabla.
USING <table_source>
Especifica el origen de datos que se hace coincidir con las filas de datos en target_tablesegn <merge_search condition>. El resultado de esta coincidencia dicta
las acciones que tomarn las clusulas WHEN de la instruccin MERGE. <table_source> puede ser una tabla remota o una tabla derivada que tengan acceso a
las tablas remotas.
<table_source> puede ser una tabla derivada que use el constructor con valores de tabla de Transact-SQL para construir una tabla especificando varias filas.
}
<cl ause_sear ch_condi t i on>: : =
<sear ch_condi t i on>
<sear ch condi t i on>: : =
{ [ NOT ] <pr edi cat e>| ( <sear ch_condi t i on>) }
[ { AND | OR } [ NOT ] { <pr edi cat e>| ( <sear ch_condi t i on>) } ]
[ , . . . n ]
<pr edi cat e>: : =
{ expr essi on { =| <>| ! =| >| >=| ! >| <| <=| ! <} expr essi on
| st r i ng_expr essi on [ NOT ] LI KE st r i ng_expr essi on
[ ESCAPE ' escape_char act er ' ]
| expr essi on [ NOT ] BETWEEN expr essi on AND expr essi on
| expr essi on I S [ NOT ] NULL
| CONTAI NS
( { col umn | * } , ' <cont ai ns_sear ch_condi t i on >' )
| FREETEXT ( { col umn | * } , ' f r eet ext _st r i ng' )
| expr essi on [ NOT ] I N ( subquer y | expr essi on [ , . . . n ] )
| expr essi on { =| <>| ! =| >| >=| ! >| <| <=| ! <}
{ ALL | SOME | ANY} ( subquer y )
| EXI STS ( subquer y ) }
<out put _cl ause>: : =
{
[ OUTPUT <dml _sel ect _l i st >I NTO { @t abl e_var i abl e | out put _t abl e }
[ ( col umn_l i st ) ] ]
[ OUTPUT <dml _sel ect _l i st >]
}
<dml _sel ect _l i st >: : =
{ <col umn_name>| scal ar _expr essi on }
[ [ AS] col umn_al i as_i dent i f i er ] [ , . . . n ]
<col umn_name>: : =
{ DELETED | I NSERTED | f r om_t abl e_name } . { * | col umn_name }
| $act i on
Para obtener ms informacin acerca de la sintaxis y los argumentos de esta clusula, vea FROM (Transact-SQL).
ON <merge_search_condition>
Especifica las condiciones en las que <table_source> se combina con target_tablepara determinar dnde coinciden.
Advertencia
Es importante especificar solamente las columnas de la tabla de destino que se utilizan para los propsitos de la coincidencia. Es decir, especifique las
columnas de la tabla de destino que se comparan con la correspondiente columna de la tabla de origen. No intente mejorar el rendimiento de las consultas
filtrando las filas de la tabla de destino en la clusula ON, segn se especifica con AND NOT t ar get _t abl e. col umn_x =val ue. Si se hace esto, se pueden
devolver resultados inesperados e incorrectos.
WHEN MATCHED THEN <merge_matched>
Especifica que todas las filas de target_table que coinciden con las filas que devuelve <table_source> ON <merge_search_condition> y que satisfacen alguna
condicin de bsqueda adicional se actualizan o eliminan segn la clusula <merge_matched>.
La instruccin MERGE puede tener a lo sumo dos clusulas WHEN MATCHED. Si se especifican dos clusulas, la primera debe ir acompaada de una clusula
AND <search_condition>. Para una fila determinada, la segunda clusula WHEN MATCHED se aplica solamente si no se aplica la primera. Si hay dos clusulas
WHEN MATCHED, una debe especificar una accin UPDATE y la otra una accin DELETE. Si se especifica UPDATE en la clusula <merge_matched> y ms de una
fila de <table_source> coincide con una fila en target_tablesegn la <merge_search_condition>, SQL Server devuelve un error. La instruccin MERGE no puede
actualizar la misma fila ms de una vez, ni actualizar o eliminar la misma fila.
WHEN NOT MATCHED [ BY TARGET ] THEN <merge_not_matched>
Especifica que una fila se inserta en target_table para cada fila que devuelve <table_source> ON <merge_search_condition> que no coincide con una fila de
target_table, pero satisface una condicin de bsqueda adicional, si est presente. La clusula <merge_not_matched> especifica los valores que insertar. La
instruccin MERGE puede tener solamente una clusula WHEN NOT MATCHED.
WHEN NOT MATCHED BY SOURCE THEN <merge_matched>
Especifica que todas las filas de target_table que no coinciden con las filas que devuelve <table_source> ON <merge_search_condition> y que satisfacen alguna
condicin de bsqueda adicional se actualizan o eliminan segn la clusula <merge_matched>.
La instruccin MERGE puede tener a lo sumo dos clusulas WHEN NOT MATCHED BY SOURCE. Si se especifican dos clusulas, la primera debe ir acompaada
de una clusula AND <clause_search_condition>. Para una fila determinada, la segunda clusula WHEN NOT MATCHED BY SOURCE se aplica solamente si no se
aplica la primera. Si hay dos clusulas WHEN NOT MATCHED BY SOURCE, una debe especificar una accin UPDATE y la otra una accin DELETE. Solamente se
puede hacer referencia a las columnas de la tabla de destino en <clause_search_condition>.
Cuando <table_source> no devuelve ninguna fila, no se puede tener acceso a las columnas de la tabla de origen. Si la accin de actualizacin o eliminacin
especificada en la clusula <merge_matched> hace referencia a las columnas de la tabla de origen, se devuelve el error 207 nombre de columna no vlido. La
clusula WHEN NOT MATCHED BY SOURCE THEN UPDATE SET Tar get Tabl e. Col 1 =Sour ceTabl e. Col 1 puede hacer que la instruccin genere un error porque
Col 1 en la tabla de origen es inaccesible.
AND <clause_search_condition>
Especifica cualquier condicin de bsqueda vlida. Para obtener ms informacin, vea Condiciones de bsqueda TransactSQL.
<table_hint_limited>
Especifica una o ms sugerencias de tabla que se aplican en la tabla de destino para cada una de las acciones de insercin, actualizacin o eliminacin que
realiza la instruccin MERGE. 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).
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. Cuando se especifica FORCESEEK, se aplica a la instancia implcita de la tabla de destino combinada con la tabla de
origen.
Advertencia
Si se especifica READPAST con WHEN NOT MATCHED [ BY TARGET ] THEN INSERT, pueden producirse operaciones INSERT que infrinjan las restricciones
UNIQUE.
INDEX ( index_val [ ,...n ] )
Especifica el nombre o identificador de uno o ms ndices de la tabla de destino para realizar una combinacin implcita con la tabla de origen. Para obtener
ms informacin, vea Sugerencias de tabla (Transact-SQL).
<output_clause>
Devuelve una fila para cada fila de target_tableque se actualiza, inserta o elimina, en ningn orden en concreto. $action se puede especificar en la clusula de
salida. $action es una columna de tipo nvarchar(10) que devuelve uno de estos tres valores por cada fila: 'INSERT', 'UPDATE' o 'DELETE', segn la accin
realizada en dicha fila. Para obtener ms informacin acerca de los argumentos de esta clusula, vea OUTPUT clusula de TransactSQL.
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).
<merge_matched>
Especifica la accin de actualizacin o eliminacin que se aplica a todas las filas de target_table que no coinciden con las filas que devuelve <table_source> ON
<merge_search_condition>, y que satisfacen cualquier condicin de bsqueda adicional.
UPDATE SET <set_clause>
Especifica la lista de nombres de columna o de variable que se van a actualizar en la tabla de destino y los valores con los que se actualizan.
Para obtener ms informacin acerca de los argumentos de esta clusula, vea UPDATE (Transact-SQL). No se puede establecer una variable con el mismo
valor que una columna.
DELETE
Especifica que las filas coincidentes de las filas de target_table se eliminan.
<merge_not_matched>
Especifica los valores que insertar en la tabla de destino.
(column_list)
Es una lista de una o varias columnas de la tabla de destino en la que insertar los datos. Las columnas se deben especificar como un nombre de una sola
parte o, de lo contrario, se producir un error en la instruccin MERGE. column_list se debe agregar entre parntesis y delimitarse mediante comas.
VALUES ( values_list)
Es una lista separada por comas de constantes, variables o expresiones que devuelve los valores que se insertarn en la tabla de destino. Las expresiones
no pueden contener una instruccin EXECUTE.
DEFAULT VALUES
Hace que la fila insertada contenga los valores predeterminados definidos para cada columna.
Para obtener ms informacin sobre esta clusula, vea INSERT (Transact-SQL).
<search condition>
Especifica las condiciones de bsqueda utilizadas para especificar <merge_search_condition> o <clause_search_condition>. Para obtener ms informacin
acerca de los argumentos de esta clusula, vea Condiciones de bsqueda TransactSQL.
Comentarios
Al menos se debe especificar una de las tres clusulas MATCHED, pero se pueden especificar en cualquier orden. Una variable no puede actualizarse ms de una vez
en la misma clusula MATCHED.
Cualquier accin de insercin, actualizacin o eliminacin especificada en la tabla de destino por la instruccin MERGE est limitada por las restricciones definidas en
ella, incluidas las restricciones de integridad referencial en cascada. Si IGNORE_DUP_KEY se establece en ON para algn ndice nico de la tabla de destino, MERGE
omite este valor.
La instruccin MERGE requiere un punto y coma ; como terminador. Se genera el error 10713 cuando una instruccin MERGE se ejecuta sin el terminador.
Cuando se utiliza despus de MERGE, @@ROWCOUNT (Transact-SQL) devuelve el nmero total de filas insertadas, actualizadas y eliminadas al cliente.
MERGE es una palabra clave totalmente reservada cuando el nivel de compatibilidad de la base de datos se establece en 100 o superior. La instruccin MERGE tambin
est disponible en los niveles de compatibilidad 90 y 100 de la base de datos; sin embargo, la palabra clave no se reserva completamente cuando el nivel de
compatibilidad se establece en 90.
La instruccin MERGEno se debe usar cuando se emplea la replicacin de actualizacin en cola. MERGE y el desencadenador de actualizacin en cola no son
compatibles. Reemplace la instruccin MERGEcon una instruccin de insercin o de actualizacin.
Implementacin de desencadenadores
Para cada accin de insercin, actualizacin o eliminacin especificada en la instruccin MERGE, SQL Server activa los desencadenadores AFTER correspondientes
definidos en la tabla de destino, pero no garantiza qu accin activar los desencadenadores primero o ltimo. Los desencadenadores definidos para la misma accin
cumplen el orden que especifique. Para obtener ms informacin sobre cmo establecer el orden de activacin de los desencadenadores, vea Especificar el primer y el
ltimo desencadenador.
Si la tabla de destino tiene habilitado un desencadenador INSTEAD OF definido en ella para una accin de insercin, actualizacin o eliminacin realizada por una
instruccin MERGE, debe tener habilitado un desencadenador INSTEAD OF para todas las acciones especificadas en la instruccin MERGE.
Si hay desencadenadores INSTEAD OF UPDATE o INSTEAD OF DELETE definidos en target_table, las operaciones de actualizacin o eliminacin no se realizan. En su
lugar, se activan los desencadenadores y las tablas inserted y deleted se rellenan en consecuencia.
Si hay definidos desencadenadores INSTED OF INSERT en target_table, la operacin de insercin no se realiza. En su lugar, se activan los desencadenadores y la tabla
inserted se rellena en consecuencia.
Permisos
Requiere el permiso SELECT en la tabla de origen y los permisos INSERT, UPDATE o DELETE en la tabla de destino. Para obtener informacin adicional, consulte la
seccin Permisos de los temas SELECT, INSERT, UPDATE o DELETE.
Ejemplos
A.Usar MERGE para realizar operaciones INSERT y UPDATE en una tabla en una sola instruccin
Un escenario comn es la actualizacin de una o varias columnas de una tabla si una fila coincidente existe, o la insercin de datos como una fila nueva si no existe
ninguna fila coincidente. Normalmente, para hacer esto se pasan los parmetros a un procedimiento almacenado que contiene las instrucciones INSERT y UPDATE
adecuadas. Con la instruccin MERGE puede realizar ambas tareas en una sola instruccin. En el ejemplo siguiente se muestra un procedimiento almacenado de la base
de datos AdventureWorks2012 que contiene una instruccin INSERT y una instruccin UPDATE. A continuacin, el procedimiento se modifica para realizar las
operaciones equivalentes utilizando una sola instruccin MERGE.
CREATE PROCEDURE dbo. I nser t Uni t Measur e
@Uni t Measur eCode nchar ( 3) ,
@Name nvar char ( 25)
AS
BEGI N
B.Usar MERGE para realizar operaciones UPDATE y DELETE en una tabla en una sola instruccin
En el siguiente ejemplo se usa MERGE para actualizar diariamente la tabla Pr oduct I nvent or y de la base de datos de ejemplo AdventureWorks2012, en funcin de los
pedidos procesados en la tabla Sal esOr der Det ai l . La columna Quant i t y de la tabla Pr oduct I nvent or y se actualiza restando el nmero de pedidos realizados cada
da para cada producto de la tabla Sal esOr der Det ai l . Si el nmero de pedidos de un producto baja el nivel de inventario del mismo hasta 0 o un valor menor, la fila
correspondiente a ese producto se elimina de la tabla Pr oduct I nvent or y.
SET NOCOUNT ON;
- - Updat e t he r ow i f i t exi st s.
UPDATE Pr oduct i on. Uni t Measur e
SET Name =@Name
WHERE Uni t Measur eCode =@Uni t Measur eCode
- - I nser t t he r ow i f t he UPDATE st at ement f ai l ed.
I F ( @@ROWCOUNT =0 )
BEGI N
I NSERT I NTO Pr oduct i on. Uni t Measur e ( Uni t Measur eCode, Name)
VALUES ( @Uni t Measur eCode, @Name)
END
END;
GO
- - Test t he pr ocedur e and r et ur n t he r esul t s.
EXEC I nser t Uni t Measur e @Uni t Measur eCode =' ABC' , @Name =' Test Val ue' ;
SELECT Uni t Measur eCode, Name FROMPr oduct i on. Uni t Measur e
WHERE Uni t Measur eCode =' ABC' ;
GO
- - Rewr i t e t he pr ocedur e t o per f or mt he same oper at i ons usi ng t he MERGE st at ement .
- - Cr eat e a t empor ar y t abl e t o hol d t he updat ed or i nser t ed val ues f r omt he OUTPUT cl ause.
CREATE TABLE #MyTempTabl e
( Exi st i ngCode nchar ( 3) ,
Exi st i ngName nvar char ( 50) ,
Exi st i ngDat e dat et i me,
Act i onTaken nvar char ( 10) ,
NewCode nchar ( 3) ,
NewName nvar char ( 50) ,
NewDat e dat et i me
) ;
GO
ALTER PROCEDURE dbo. I nser t Uni t Measur e
@Uni t Measur eCode nchar ( 3) ,
@Name nvar char ( 25)
AS
BEGI N
SET NOCOUNT ON;
MERGE Pr oduct i on. Uni t Measur e AS t ar get
USI NG ( SELECT @Uni t Measur eCode, @Name) AS sour ce ( Uni t Measur eCode, Name)
ON ( t ar get . Uni t Measur eCode =sour ce. Uni t Measur eCode)
WHEN MATCHED THEN
UPDATE SET Name =sour ce. Name
WHEN NOT MATCHED THEN
I NSERT ( Uni t Measur eCode, Name)
VALUES ( sour ce. Uni t Measur eCode, sour ce. Name)
OUTPUT del et ed. *, $act i on, i nser t ed. * I NTO #MyTempTabl e;
END;
GO
- - Test t he pr ocedur e and r et ur n t he r esul t s.
EXEC I nser t Uni t Measur e @Uni t Measur eCode =' ABC' , @Name =' New Test Val ue' ;
EXEC I nser t Uni t Measur e @Uni t Measur eCode =' XYZ' , @Name =' Test Val ue' ;
EXEC I nser t Uni t Measur e @Uni t Measur eCode =' ABC' , @Name =' Anot her Test Val ue' ;
SELECT * FROM#MyTempTabl e;
- - Cl eanup
DELETE FROMPr oduct i on. Uni t Measur e WHERE Uni t Measur eCode I N ( ' ABC' , ' XYZ' ) ;
DROP TABLE #MyTempTabl e;
GO
I F OBJ ECT_I D ( N' Pr oduct i on. usp_Updat eI nvent or y' , N' P' ) I S NOT NULL DROP PROCEDURE Pr oduct i on. usp_Updat eI nvent or y;
GO
CREATE PROCEDURE Pr oduct i on. usp_Updat eI nvent or y
@Or der Dat e dat et i me
AS
MERGE Pr oduct i on. Pr oduct I nvent or y AS t ar get
USI NG ( SELECT Pr oduct I D, SUM( Or der Qt y) FROMSal es. Sal esOr der Det ai l AS sod
J OI N Sal es. Sal esOr der Header AS soh
ON sod. Sal esOr der I D =soh. Sal esOr der I D
AND soh. Or der Dat e =@Or der Dat e
GROUP BY Pr oduct I D) AS sour ce ( Pr oduct I D, Or der Qt y)
ON ( t ar get . Pr oduct I D =sour ce. Pr oduct I D)
WHEN MATCHED AND t ar get . Quant i t y - sour ce. Or der Qt y <=0
THEN DELETE
WHEN MATCHED
THEN UPDATE SET t ar get . Quant i t y =t ar get . Quant i t y - sour ce. Or der Qt y,
t ar get . Modi f i edDat e =GETDATE( )
OUTPUT $act i on, I nser t ed. Pr oduct I D, I nser t ed. Quant i t y, I nser t ed. Modi f i edDat e, Del et ed. Pr oduct I D,
C.Usar MERGE para realizar operaciones INSERT y UPDATE en una tabla de destino mediante una tabla de origen derivada
En el ejemplo siguiente se usa MERGE para modificar la tabla Sal esReason de la base de datos AdventureWorks2012, actualizando o insertando las filas. Cuando el
valor de NewName de la tabla de origen coincide con un valor de la columna Name de la tabla de destino, (Sal esReason), la columna ReasonType se actualiza en la tabla
de destino. Cuando el valor de NewName no coincide, la fila del origen se inserta en la tabla de destino. La tabla de origen es una tabla derivada que usa la caracterstica
de constructor con valores de tabla de Transact-SQL para especificar varias filas en la tabla de origen. Para obtener ms informacin acerca de cmo usar el
constructor de valores de tabla en una tabla derivada, vea Constructor con valores de tabla (Transact-SQL). El ejemplo tambin muestra cmo almacenar los resultados
de la clusula OUTPUT en una variable de tabla y, a continuacin, resumir los resultados de la instruccin MERGE realizando una sencilla operacin SELECT que
devuelve el recuento de las filas insertadas y actualizadas.
D.Insertar los resultados de la instruccin MERGE en otra tabla
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 Quant i t y de la tabla Pr oduct I nvent or y de la base de datos AdventureWorks2012, en funcin de los pedidos procesados en la tabla
Sal esOr der Det ai l . En el ejemplo se capturan las filas actualizadas y se insertan en otra tabla que se usa para realizar el seguimiento de los cambios del inventario.
Vea tambin
Referencia
SELECT (Transact-SQL)
INSERT (Transact-SQL)
UPDATE (Transact-SQL)
DELETE (Transact-SQL)
OUTPUT clusula de TransactSQL
FROM (Transact-SQL)
Constructor con valores de tabla (Transact-SQL)
Conceptos
MERGE en paquetes de Integration Services
2014 Microsoft
Del et ed. Quant i t y, Del et ed. Modi f i edDat e;
GO
EXECUTE Pr oduct i on. usp_Updat eI nvent or y ' 20030501'
- - Cr eat e a t empor ar y t abl e var i abl e t o hol d t he out put act i ons.
DECLARE @Summar yOf Changes TABLE( Change VARCHAR( 20) ) ;
MERGE I NTO Sal es. Sal esReason AS Tar get
USI NG ( VALUES ( ' Recommendat i on' , ' Ot her ' ) , ( ' Revi ew' , ' Mar ket i ng' ) , ( ' I nt er net ' , ' Pr omot i on' ) )
AS Sour ce ( NewName, NewReasonType)
ON Tar get . Name =Sour ce. NewName
WHEN MATCHED THEN
UPDATE SET ReasonType =Sour ce. NewReasonType
WHEN NOT MATCHED BY TARGET THEN
I NSERT ( Name, ReasonType) VALUES ( NewName, NewReasonType)
OUTPUT $act i on I NTO @Summar yOf Changes;
- - Quer y t he r esul t s of t he t abl e var i abl e.
SELECT Change, COUNT( *) AS Count Per Change
FROM@Summar yOf Changes
GROUP BY Change;
CREATE TABLE Pr oduct i on. Updat edI nvent or y
( Pr oduct I D I NT NOT NULL, Locat i onI D i nt , NewQt y i nt , Pr evi ousQt y i nt ,
CONSTRAI NT PK_I nvent or y PRI MARY KEY CLUSTERED ( Pr oduct I D, Locat i onI D) ) ;
GO
I NSERT I NTO Pr oduct i on. Updat edI nvent or y
SELECT Pr oduct I D, Locat i onI D, NewQt y, Pr evi ousQt y
FROM
( MERGE Pr oduct i on. Pr oduct I nvent or y AS pi
USI NG ( SELECT Pr oduct I D, SUM( Or der Qt y)
FROMSal es. Sal esOr der Det ai l AS sod
J OI N Sal es. Sal esOr der Header AS soh
ON sod. Sal esOr der I D =soh. Sal esOr der I D
AND soh. Or der Dat e BETWEEN ' 20030701' AND ' 20030731'
GROUP BY Pr oduct I D) AS sr c ( Pr oduct I D, Or der Qt y)
ON pi . Pr oduct I D =sr c. Pr oduct I D
WHEN MATCHED AND pi . Quant i t y - sr c. Or der Qt y >=0
THEN UPDATE SET pi . Quant i t y =pi . Quant i t y - sr c. Or der Qt y
WHEN MATCHED AND pi . Quant i t y - sr c. Or der Qt y <=0
THEN DELETE
OUTPUT $act i on, I nser t ed. Pr oduct I D, I nser t ed. Locat i onI D, I nser t ed. Quant i t y AS NewQt y, Del et ed. Quant i t y AS Pr evi ousQt y)
AS Changes ( Act i on, Pr oduct I D, Locat i onI D, NewQt y, Pr evi ousQt y) WHERE Act i on =' UPDATE' ;
GO
OPTION clusula de TransactSQL
Especifica que en toda la consulta se debe utilizar la sugerencia de consulta especificada. Solo se puede especificar cada sugerencia de consulta una vez, aunque se
permiten varias sugerencias de consulta. Solo se puede especificar una clusula OPTION con la instruccin.
Esta clusula se puede especificar en las instrucciones SELECT, DELETE, UPDATE y MERGE.
Se aplica a: SQL Server (SQL Server 2008 a versin actual, Windows Azure SQL Database Versin inicial a versin actual).
Convenciones de sintaxis de Transact-SQL
Sintaxis
Argumentos
query_hint
Palabras clave que indican qu sugerencias del optimizador se emplean para personalizar la forma en que el Motor de base de datos procesa la instruccin.
Para obtener ms informacin, vea Sugerencias de consulta (Transact-SQL).
Ejemplos
En el ejemplo siguiente se muestra cmo se usa la clusula OPTI ON con una clusula GROUP BY.
Vea tambin
Referencia
Sugerencias (Transact-SQL)
SELECT (Transact-SQL)
UPDATE (Transact-SQL)
MERGE (Transact-SQL)
DELETE (Transact-SQL)
2014 Microsoft
SQL Server 2014
[ OPTI ON ( <quer y_hi nt >[ , . . . n ] ) ]
USE Advent ur eWor ks2012;
GO
SELECT Pr oduct I D, Or der Qt y, SUM( Li neTot al ) AS Tot al
FROMSal es. Sal esOr der Det ai l
WHERE Uni t Pr i ce <$5. 00
GROUP BY Pr oduct I D, Or der Qt y
ORDER BY Pr oduct I D, Or der Qt y
OPTI ON ( HASH GROUP, FAST 10) ;
GO
OUTPUT clusula de TransactSQL
Devuelve informacin de las filas afectadas por una instruccin INSERT, UPDATE, DELETE o MERGE, o expresiones basadas en esas filas. 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. Los resultados
tambin se pueden insertar en una tabla o variable de tabla. Adems, puede capturar los resultados de una clusula OUTPUT en una instruccin anidada INSERT, UPDATE,
DELETE o MERGE, e insertar los resultados en una tabla de destino o vista.
Nota
Una instruccin UPDATE, INSERT o DELETE que tenga una clusula OUTPUT devolver filas al cliente aunque la instruccin encuentre errores y se revierta. El resultado
no se debe usar si se produce algn error al ejecutar la instruccin.
Se utiliza en:
DELETE
INSERT
UPDATE
MERGE
Se aplica a: SQL Server (SQL Server 2008 a versin actual, Windows Azure SQL Database Versin inicial a versin actual).
Convenciones de sintaxis de Transact-SQL
Sintaxis
Argumentos
@table_variable
Especifica una variable table en la que se insertan las filas devueltas en lugar de devolverse al autor de la llamada. Debe declararse @table_variable antes de la
instruccin INSERT, UPDATE, DELETE o MERGE.
Si no se especifica column_list, la variable tabledebe tener el mismo nmero de columnas que el conjunto de resultados OUTPUT. Las excepciones son las
columnas de identidad y calculadas, que deben omitirse. Si se especifica column_list, las columnas omitidas deben aceptar valores NULL o tener valores
predeterminados asignados.
Para obtener ms informacin acerca de las variables table, vea table (Transact-SQL).
output_table
Especifica una tabla en la que se insertan las filas devueltas en lugar de devolverse al autor de la llamada. output_table puede ser una tabla temporal.
Si no se especifica column_list, la tabla debe tener el mismo nmero de columnas que el conjunto de resultados OUTPUT. Las excepciones son las columnas de
identidad y calculadas. stas deben omitirse. Si se especifica column_list, las columnas omitidas deben aceptar valores NULL o tener valores predeterminados
asignados.
output_table no puede:
Tener definidos desencadenadores habilitados.
Participar en alguna de las partes de una restriccin FOREIGN KEY.
Tener restricciones CHECK o reglas habilitadas.
column_list
Es una lista opcional de nombres de columna de la tabla de destino de la clusula INTO. Es equivalente a la lista de columnas permitida en la instruccin INSERT.
scalar_expression
Es cualquier combinacin de smbolos y operadores que se evala como un solo valor. No se permiten funciones de agregado en scalar_expression.
Cualquier referencia a las columnas de la tabla que se va a modificar debe calificarse con el prefijo INSERTED o DELETED.
SQL Server 2014
<OUTPUT_CLAUSE>: : =
{
[ OUTPUT <dml _sel ect _l i st >I NTO { @t abl e_var i abl e | out put _t abl e } [ ( col umn_l i st ) ] ]
[ OUTPUT <dml _sel ect _l i st >]
}
<dml _sel ect _l i st >: : =
{ <col umn_name>| scal ar _expr essi on } [ [ AS] col umn_al i as_i dent i f i er ]
[ , . . . n ]
<col umn_name>: : =
{ DELETED | I NSERTED | f r om_t abl e_name } . { * | col umn_name }
| $act i on
column_alias_identifier
Es un nombre alternativo que se utiliza para hacer referencia al nombre de columna.
DELETED
Es un prefijo de columna que especifica el valor eliminado en la operacin de actualizacin o eliminacin. Las columnas con prefijo DELETED reflejan el valor
antes de que se complete la instruccin UPDATE, DELETE o MERGE.
DELETED no se puede utilizar con la clusula OUTPUT en la instruccin INSERT.
INSERTED
Es un prefijo de columna que especifica el valor agregado en la operacin de insercin o actualizacin. Las columnas con prefijo INSERTED reflejan el valor
despus de que se complete la instruccin UPDATE, INSERT o MERGE, pero antes de que se ejecuten los desencadenadores.
INSERTED no se puede utilizar con la clusula OUTPUT en la instruccin DELETE.
from_table_name
Es un prefijo de columna que especifica una tabla incluida en la clusula FROM de una instruccin DELETE, UPDATE o MERGE que se utiliza para especificar las
filas que se van a actualizar o eliminar.
Si la tabla que se va a modificar se especifica tambin en la clusula FROM, cualquier referencia a las columnas de esa tabla deben calificarse con el prefijo
INSERTED o DELETED.
*
Especifica que todas las columnas afectadas por la accin de eliminacin, insercin o actualizacin se devuelvan en el orden en que se encuentran en la tabla.
Por ejemplo, OUTPUT DELETED. * en la siguiente instruccin DELETE devuelve todas las columnas eliminadas de la tabla Shoppi ngCar t I t em:
column_name
Es una referencia explcita a una columna. Cualquier referencia a la tabla que se va a modificar debe certificarse correctamente mediante el prefijo INSERTED o
DELETED, segn corresponda; por ejemplo: INSERTED.column_name.
$action
Solo est disponible para la instruccin MERGE. Especifica una columna de tipo nvarchar(10) en la clusula OUTPUT de una instruccin MERGE que devuelve uno
de estos tres valores por cada fila: 'INSERT', 'UPDATE' o 'DELETE', segn la accin realizada en dicha fila.
Comentarios
La clusula OUTPUT <dml_select_list> y la clusula OUTPUT <dml_select_list> INTO { @table_variable | output_table} pueden definirse en una sola instruccin INSERT,
UPDATE, DELETE o MERGE.
Nota
A menos que se indique lo contrario, las referencias a la clusula OUTPUT se refieren tanto a la clusula OUTPUT como a la clusula OUTPUT INTO.
La clusula OUTPUT puede ser til para recuperar el valor de las columnas de identidad o calculadas despus de una operacin con INSERT o UPDATE.
Cuando se incluye una columna calculada en <dml_select_list>, la columna correspondiente de la tabla de salida o variable de tabla no es una columna calculada. Los
valores de la nueva columna son los que se calcularon en el momento en que se ejecut la instruccin.
No se garantiza que coincidan el orden en que se aplican los cambios en la tabla y el orden en que se insertan las filas en la tabla de salida o variable de tabla.
Si se modifican parmetros o variables como parte de una instruccin UPDATE, la clusula OUTPUT siempre devuelve el valor del parmetro o la variable tal como se
encontraba antes de ejecutar la instruccin, en lugar de devolver el valor modificado.
OUTPUT se puede utilizar con una instruccin UPDATE o DELETE en un cursor que utilice la sintaxis WHERE CURRENT OF.
La clusula OUTPUT no se admite en las siguientes instrucciones:
Instrucciones DML que hacen referencia a vistas locales con particiones, vistas distribuidas con particiones o tablas remotas.
Instrucciones INSERT que contienen una instruccin EXECUTE.
Los predicados de texto completo no estn permitidos en la clusula OUTPUT cuando el nivel de compatibilidad de la base de datos est establecido en 100.
La clusula OUTPUT INTO no se puede utilizar para realizar inserciones en vistas o en una funcin de conjunto de filas.
No se puede crear una funcin definida por el usuario si contiene una clusula OUTPUT INTO que tiene una tabla como destino.
Para evitar el comportamiento no determinista, la clusula OUTPUT no puede contener las referencias siguientes:
Subconsultas o funciones definidas por el usuario que obtienen acceso a datos de usuario o del sistema, o que se asume que obtienen dicho acceso. Se supone
que las funciones definidas por el usuario realizan el acceso a los datos si no estn enlazadas a un esquema.
Una columna de una vista o funcin insertada con valores de tabla si la columna se define mediante uno de los mtodos siguientes:
Una subconsulta.
DELETE Sal es. Shoppi ngCar t I t em
OUTPUT DELETED. *;
Una funcin definida por el usuario que obtiene acceso a datos de usuario o del sistema, o que se asume que obtiene dicho acceso.
Una columna calculada que contiene una funcin definida por el usuario que obtiene acceso a datos de usuario o del sistema en su definicin.
Cuando SQL Server detecta este tipo de columna en la clusula OUTPUT, se produce el error 4186. Para obtener ms informacin, vea MSSQLSERVER_4186.
Insertar datos devueltos de una clusula OUTPUT en una tabla
Al capturar los resultados de una clusula OUTPUT en una instruccin INSERT, UPDATE, DELETE o MERGE anidada e insertarlos en una tabla de destino, tenga presente
la informacin siguiente:
Toda la operacin es atmica. Se ejecutarn la instruccin INSERT y la instruccin DML anidada que contiene la clusula OUTPUT, o bien se producir un error en
toda la instruccin.
Las restricciones siguientes se aplican al destino de la instruccin INSERT externa:
El destino no puede ser una expresin de tabla comn, vista o tabla remota.
El destino no puede tener una restriccin FOREIGN KEY, ni ser objeto de referencia por una restriccin FOREIGN KEY.
No se pueden definir desencadenadores en el destino.
El destino no puede participar en la replicacin de mezcla ni en las suscripciones actualizables para la replicacin transaccional.
Las restricciones siguientes se aplican a la instruccin DML anidada:
El destino no puede ser una tabla remota ni una vista con particiones.
El propio origen no puede contener una clusula <dml_table_source>.
La clusula OUTPUT INTO no se admite en instrucciones INSERT que contengan una clusula <dml_table_source>.
@@ROWCOUNT devuelve las filas insertadas nicamente por la instruccin INSERT externa.
@@IDENTITY, SCOPE_IDENTITY e IDENT_CURRENT devuelven los valores de identidad generados solo por la instruccin DML anidada, y no los generados por la
instruccin INSERT externa.
Las notificaciones de consulta tratan la instruccin como una entidad nica, y el tipo de cualquier mensaje creado es el del DML anidado, aunque el cambio
significativo provenga de la propia instruccin INSERT externa.
En la clusula <dml_table_source>, las clusulas SELECT y WHERE no pueden incluir subconsultas, funciones de agregado, funciones de categora, predicados de
texto completo, funciones definidas por el usuario que realicen accesos a datos, ni la funcin TEXTPTR.
Desencadenadores
Las columnas devueltas de OUTPUT reflejan los datos tal como estaban despus de completarse la instruccin INSERT, UPDATE o DELETE, pero antes de ejecutarse los
desencadenadores.
En el caso de los desencadenadores INSTEAD OF, los resultados devueltos se generan como si la operacin de INSERT, UPDATE o DELETE se hubiese producido
realmente, aunque no se produzcan modificaciones como resultado de la operacin del desencadenador. Si se utiliza una instruccin que incluye una clusula OUTPUT
en el cuerpo de un desencadenador, deben utilizarse alias de tabla para hacer referencia a las tablas inserted y deleted del desencadenador con el fin de evitar la
duplicacin de las referencias a columnas con las tablas INSERTED y DELETED asociadas a OUTPUT.
Si la clusula OUTPUT se especifica sin especificar tambin la palabra clave INTO, el destino de la operacin DML no puede tener definido ningn desencadenador
habilitado para la accin DML dada. Por ejemplo, si se define la clusula OUTPUT en una instruccin UPDATE, la tabla de destino no puede tener desencadenadores
UPDATE habilitados.
Si se establece la opcin sp_configure de disallow results from triggers, una clusula OUTPUT sin una clusula INTO har que la instruccin genere un error cuando se
invoque desde un desencadenador.
Tipos de datos
La clusula OUTPUT admite los tipos de datos de objetos grandes: nvarchar(max), varchar(max), varbinary(max), text, ntext, image y xml. Cuando se utiliza la
clusula .WRITE en la instruccin UPDATE para modificar una columna de tipo nvarchar(max), varchar(max) o varbinary(max), se devuelven las imgenes anterior y
posterior completas de los valores si se hace referencia a ellas. La funcin TEXTPTR no puede aparecer como parte de una expresin en una columna de tipo text,
ntext o imageen la clusula OUTPUT.
Colas
OUTPUT se puede utilizar en aplicaciones que utilizan tablas como colas, o para contener conjuntos de resultados intermedios. Dicho de otro modo, la aplicacin
agrega o quita filas de la tabla constantemente. En el ejemplo siguiente se utiliza la clusula OUTPUT en una instruccin DELETE para devolver la fila eliminada a la
aplicacin que realiza la llamada.
En este ejemplo, se quita una fila de una tabla utilizada como cola y se devuelven los valores eliminados a la aplicacin de procesamiento en una nica accin. Tambin
se puede implementar otro tipo de semntica, como utilizar una tabla para implementar una pila. No obstante, SQL Server no garantiza el orden en que las
instrucciones DML procesan y devuelven las filas por medio de la clusula OUTPUT. Es la aplicacin la que debe incluir una clusula WHERE que garantice la semntica
deseada, o reconocer que, si hay varias filas aptas para la operacin DML, no se garantiza el orden. En el ejemplo siguiente se utiliza una subconsulta y se supone que
USE Advent ur eWor ks2012;
GO
DELETE TOP( 1) dbo. Dat abaseLog WI TH ( READPAST)
OUTPUT del et ed. *
WHERE Dat abaseLogI D =7;
GO
la unicidad es una caracterstica de la columna Dat abaseLogI Dpara implementar la semntica de ordenacin deseada.
Nota
Use la sugerencia de tabla READPAST en las instrucciones UPDATE y DELETE si el escenario permite que varias aplicaciones realicen una lectura destructiva de una
tabla. De esta forma se impide que surjan problemas de bloqueo si otra aplicacin ya est leyendo el primer registro de la tabla que rene los requisitos.
Permisos
Se requieren permisos SELECT en las columnas recuperadas a travs de <dml_select_list> o utilizadas en <scalar_expression>.
Se requieren permisos INSERT en las tablas especificadas en <output_table>.
Ejemplos
A.Utilizar OUTPUT INTO con una instruccin INSERT simple
En el siguiente ejemplo se inserta una fila en la tabla Scr apReason y se utiliza la clusula OUTPUT para devolver los resultados de la instruccin a la variable
t abl e@MyTabl eVar . Como la columna Scr apReasonI Dse ha definido con una propiedad IDENTITY, no se especifica ningn valor en la instruccin I NSERT de esa
columna. No obstante, tenga en cuenta que el valor generado por el Motor de base de datos para esa columna se devuelve en la clusula OUTPUT de la columna
i nser t ed. Scr apReasonI D.
USE t empdb;
GO
CREATE TABLE dbo. t abl e1
(
i d I NT,
empl oyee VARCHAR( 32)
) ;
GO
I NSERT I NTO dbo. t abl e1 VALUES
( 1, ' Fr ed' )
, ( 2, ' Tom' )
, ( 3, ' Sal l y' )
, ( 4, ' Al i ce' ) ;
GO
DECLARE @MyTabl eVar TABLE
(
i d I NT,
empl oyee VARCHAR( 32)
) ;
PRI NT ' t abl e1, bef or e del et e'
SELECT * FROMdbo. t abl e1;
DELETE FROMdbo. t abl e1
OUTPUT DELETED. * I NTO @MyTabl eVar
WHERE i d =4 OR i d =2;
PRI NT ' t abl e1, af t er del et e'
SELECT * FROMdbo. t abl e1;
PRI NT ' @MyTabl eVar , af t er del et e'
SELECT * FROM@MyTabl eVar ;
DROP TABLE dbo. t abl e1;
- - Resul t s
- - t abl e1, bef or e del et e
- - i d empl oyee
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - 1 Fr ed
- - 2 Tom
- - 3 Sal l y
- - 4 Al i ce
- -
- - t abl e1, af t er del et e
- - i d empl oyee
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - 1 Fr ed
- - 3 Sal l y
- - @MyTabl eVar , af t er del et e
- - i d empl oyee
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - 2 Tom
- - 4 Al i ce
B.Usar OUTPUT con una instruccin DELETE
En el ejemplo siguiente se eliminan todas las filas de la tabla Shoppi ngCar t I t em. La clusula OUTPUT del et ed. * especifica que se devuelvan a la aplicacin que realiza
la llamada los resultados de la instruccin DELETE, es decir, todas las columnas de las filas eliminadas. La instruccin SELECT posterior comprueba los resultados de la
operacin de eliminacin en la tabla Shoppi ngCar t I t em.
C.Usar OUTPUT INTO con una instruccin UPDATE
En el ejemplo siguiente se actualiza un 25 por ciento la columna Vacat i onHour s de las 10 primeras filas de la tabla Empl oyee. La clusula OUTPUT devuelve el valor de
Vacat i onHour s antes de aplicar la instruccin UPDATE en la columna del et ed. Vacat i onHour s, y el valor actualizado de la columna i nser t ed. Vacat i onHour s en la
variable t abl e@MyTabl eVar .
Las dos instrucciones SELECT que le siguen devuelven los valores en @MyTabl eVar y los resultados de la operacin de actualizacin en la tabla Empl oyee.
D.Usar OUTPUT INTO para devolver una expresin
El ejemplo siguiente, que se basa en el ejemplo C, define una expresin en la clusula OUTPUT como la diferencia entre el valor actualizado de Vacat i onHour s y el valor
de Vacat i onHour s antes de aplicar la actualizacin. El valor de esta expresin se devuelve a la variable t abl e@MyTabl eVar en la columna Vacat i onHour sDi f f er ence.
USE Advent ur eWor ks2012;
GO
DECLARE @MyTabl eVar t abl e( NewScr apReasonI D smal l i nt ,
Name var char ( 50) ,
Modi f i edDat e dat et i me) ;
I NSERT Pr oduct i on. Scr apReason
OUTPUT I NSERTED. Scr apReasonI D, I NSERTED. Name, I NSERTED. Modi f i edDat e
I NTO @MyTabl eVar
VALUES ( N' Oper at or er r or ' , GETDATE( ) ) ;
- - Di spl ay t he r esul t set of t he t abl e var i abl e.
SELECT NewScr apReasonI D, Name, Modi f i edDat e FROM@MyTabl eVar ;
- - Di spl ay t he r esul t set of t he t abl e.
SELECT Scr apReasonI D, Name, Modi f i edDat e
FROMPr oduct i on. Scr apReason;
GO
USE Advent ur eWor ks2012;
GO
DELETE Sal es. Shoppi ngCar t I t em
OUTPUT DELETED. *
WHERE Shoppi ngCar t I D =20621;
- - Ver i f y t he r ows i n t he t abl e mat chi ng t he WHERE cl ause have been del et ed.
SELECT COUNT( *) AS [ Rows i n Tabl e] FROMSal es. Shoppi ngCar t I t emWHERE Shoppi ngCar t I D =20621;
GO
USE Advent ur eWor ks2012;
GO
DECLARE @MyTabl eVar t abl e(
EmpI D i nt NOT NULL,
Ol dVacat i onHour s i nt ,
NewVacat i onHour s i nt ,
Modi f i edDat e dat et i me) ;
UPDATE TOP ( 10) HumanResour ces. Empl oyee
SET Vacat i onHour s =Vacat i onHour s * 1. 25,
Modi f i edDat e =GETDATE( )
OUTPUT i nser t ed. Busi nessEnt i t yI D,
del et ed. Vacat i onHour s,
i nser t ed. Vacat i onHour s,
i nser t ed. Modi f i edDat e
I NTO @MyTabl eVar ;
- - Di spl ay t he r esul t set of t he t abl e var i abl e.
SELECT EmpI D, Ol dVacat i onHour s, NewVacat i onHour s, Modi f i edDat e
FROM@MyTabl eVar ;
GO
- - Di spl ay t he r esul t set of t he t abl e.
SELECT TOP ( 10) Busi nessEnt i t yI D, Vacat i onHour s, Modi f i edDat e
FROMHumanResour ces. Empl oyee;
GO
USE Advent ur eWor ks2012;
GO
DECLARE @MyTabl eVar t abl e(
EmpI D i nt NOT NULL,
Ol dVacat i onHour s i nt ,
E.Usar OUTPUT INTO con from_table_name en una instruccin UPDATE
En el ejemplo siguiente se actualiza la columna Scr apReasonI D de la tabla Wor kOr der para todas las rdenes de trabajo que tengan especificados Pr oduct I Dy
Scr apReasonI D. La clusula OUTPUT I NTOdevuelve los valores de la tabla que se actualiza (Wor kOr der ) y de la tabla Pr oduct . La tabla Pr oduct se utiliza en la clusula
FROMpara especificar las filas que se van a actualizar. Dado que la tabla Wor kOr der tiene definido un desencadenador AFTER UPDATE, se requiere la palabra clave I NTO.
F.Usar OUTPUT INTO con from_table_name en una instruccin DELETE
En el ejemplo siguiente se eliminan las filas de la tabla Pr oduct Pr oduct Phot o segn los criterios de bsqueda definidos en la clusula FROMde la instruccin DELETE. La
clusula OUTPUT devuelve columnas de la tabla que se elimina (del et ed. Pr oduct I D, del et ed. Pr oduct Phot oI D) y de la tabla Pr oduct . La tabla se utiliza en la clusula
FROMpara especificar las filas que se van a eliminar.
NewVacat i onHour s i nt ,
Vacat i onHour sDi f f er ence i nt ,
Modi f i edDat e dat et i me) ;
UPDATE TOP ( 10) HumanResour ces. Empl oyee
SET Vacat i onHour s =Vacat i onHour s * 1. 25,
Modi f i edDat e =GETDATE( )
OUTPUT i nser t ed. Busi nessEnt i t yI D,
del et ed. Vacat i onHour s,
i nser t ed. Vacat i onHour s,
i nser t ed. Vacat i onHour s - del et ed. Vacat i onHour s,
i nser t ed. Modi f i edDat e
I NTO @MyTabl eVar ;
- - Di spl ay t he r esul t set of t he t abl e var i abl e.
SELECT EmpI D, Ol dVacat i onHour s, NewVacat i onHour s,
Vacat i onHour sDi f f er ence, Modi f i edDat e
FROM@MyTabl eVar ;
GO
SELECT TOP ( 10) Busi nessEnt i t yI D, Vacat i onHour s, Modi f i edDat e
FROMHumanResour ces. Empl oyee;
GO
USE Advent ur eWor ks2012;
GO
DECLARE @MyTest Var t abl e (
Ol dScr apReasonI D i nt NOT NULL,
NewScr apReasonI D i nt NOT NULL,
Wor kOr der I D i nt NOT NULL,
Pr oduct I D i nt NOT NULL,
Pr oduct Name nvar char ( 50) NOT NULL) ;
UPDATE Pr oduct i on. Wor kOr der
SET Scr apReasonI D =4
OUTPUT del et ed. Scr apReasonI D,
i nser t ed. Scr apReasonI D,
i nser t ed. Wor kOr der I D,
i nser t ed. Pr oduct I D,
p. Name
I NTO @MyTest Var
FROMPr oduct i on. Wor kOr der AS wo
I NNER J OI N Pr oduct i on. Pr oduct AS p
ON wo. Pr oduct I D =p. Pr oduct I D
AND wo. Scr apReasonI D=16
AND p. Pr oduct I D =733;
SELECT Ol dScr apReasonI D, NewScr apReasonI D, Wor kOr der I D,
Pr oduct I D, Pr oduct Name
FROM@MyTest Var ;
GO
USE Advent ur eWor ks2012;
GO
DECLARE @MyTabl eVar t abl e (
Pr oduct I D i nt NOT NULL,
Pr oduct Name nvar char ( 50) NOT NULL,
Pr oduct Model I D i nt NOT NULL,
Phot oI D i nt NOT NULL) ;
DELETE Pr oduct i on. Pr oduct Pr oduct Phot o
OUTPUT DELETED. Pr oduct I D,
p. Name,
p. Pr oduct Model I D,
DELETED. Pr oduct Phot oI D
I NTO @MyTabl eVar
FROMPr oduct i on. Pr oduct Pr oduct Phot o AS ph
J OI N Pr oduct i on. Pr oduct as p
ON ph. Pr oduct I D =p. Pr oduct I D
WHERE p. Pr oduct Model I D BETWEEN 120 and 130;
G.Usar OUTPUT INTO con un tipo de datos de objetos grandes
En el ejemplo siguiente se actualiza un valor parcial de Document Summar y, una columna de tipo nvar char ( max) de la tabla Pr oduct i on. Document , utilizando la clusula
. WRI TE. La palabra component s se sustituye por la palabra f eat ur es al especificar 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 se utiliza la clusula OUTPUT para devolver las imgenes anterior
y posterior de la columna Document Summar y en la variable t abl e@MyTabl eVar . Observe que se devuelven las imgenes anterior y posterior completas de la columna
Document Summar y.
H.Usar OUTPUT en un desencadenador INSTEAD OF
En el ejemplo siguiente se utiliza la clusula OUTPUT en un desencadenador para devolver los resultados de la operacin del desencadenador. En primer lugar se crea
una vista en la tabla Scr apReason y, despus, en la vista se define un desencadenador I NSTEAD OF I NSERT que permite al usuario modificar nicamente la columna
Name de la tabla base. Puesto que la columna Scr apReasonI Des una columna I DENTI TY de la tabla base, el desencadenador omite el valor suministrado por el usuario.
Esto permite que el Motor de base de datos genere automticamente el valor correcto. Asimismo, se omite el valor suministrado por el usuario para Modi f i edDat e,
que se establece en la fecha actual. La clusula OUTPUT devuelve los valores reales insertados en la tabla Scr apReason.
ste es el conjunto de resultados generado el 12 de abril de 2004 '2004- 04- 12' ). Tenga en cuenta que las columnas Scr apReasonI DAct ual y Modi f i edDat e reflejan
los valores generados en la operacin del desencadenador en lugar de los valores suministrados en la instruccin I NSERT.
Scr apReasonI D Name Modi f i edDat e
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
17 My scr ap r eason 2004- 04- 12 16: 23: 33. 050
I.Usar OUTPUT INTO con columnas de identidad y calculadas
En el ejemplo siguiente se crea la tabla Empl oyeeSal es y, despus, se insertan en ella varias filas utilizando una instruccin I NSERT con una instruccin SELECT para
recuperar los datos de las tablas de origen. La tabla Empl oyeeSal es contiene una columna de identidad (Empl oyeeI D) y una columna calculada (Pr oj ect edSal es).
- - Di spl ay t he r esul t s of t he t abl e var i abl e.
SELECT Pr oduct I D, Pr oduct Name, Pr oduct Model I D, Phot oI D
FROM@MyTabl eVar
ORDER BY Pr oduct Model I D;
GO
USE Advent ur eWor ks2012;
GO
DECLARE @MyTabl eVar t abl e (
Summar yBef or e nvar char ( max) ,
Summar yAf t er nvar char ( max) ) ;
UPDATE Pr oduct i on. Document
SET Document Summar y . WRI TE ( N' f eat ur es' , 28, 10)
OUTPUT del et ed. Document Summar y,
i nser t ed. Document Summar y
I NTO @MyTabl eVar
WHERE Ti t l e =N' Fr ont Ref l ect or Br acket I nst al l at i on' ;
SELECT Summar yBef or e, Summar yAf t er
FROM@MyTabl eVar ;
GO
USE Advent ur eWor ks2012;
GO
I F OBJ ECT_I D( ' dbo. vw_Scr apReason' , ' V' ) I S NOT NULL
DROP VI EWdbo. vw_Scr apReason;
GO
CREATE VI EWdbo. vw_Scr apReason
AS ( SELECT Scr apReasonI D, Name, Modi f i edDat e
FROMPr oduct i on. Scr apReason) ;
GO
CREATE TRI GGER dbo. i o_Scr apReason
ON dbo. vw_Scr apReason
I NSTEAD OF I NSERT
AS
BEGI N
- - Scr apReasonI D i s not speci f i ed i n t he l i st of col umns t o be i nser t ed
- - because i t i s an I DENTI TY col umn.
I NSERT I NTO Pr oduct i on. Scr apReason ( Name, Modi f i edDat e)
OUTPUT I NSERTED. Scr apReasonI D, I NSERTED. Name,
I NSERTED. Modi f i edDat e
SELECT Name, get dat e( )
FROMi nser t ed;
END
GO
I NSERT vw_Scr apReason ( Scr apReasonI D, Name, Modi f i edDat e)
VALUES ( 99, N' My scr ap r eason' , ' 20030404' ) ;
GO
J.Usar OUTPUT y OUTPUT INTO en una sola instruccin
En el ejemplo siguiente se eliminan las filas de la tabla Pr oduct Pr oduct Phot o segn los criterios de bsqueda definidos en la clusula FROMde la instruccin DELETE. La
clusula OUTPUT I NTOdevuelve las columnas de la tabla que se elimina (del et ed. Pr oduct I D, del et ed. Pr oduct Phot oI D) y columnas de la tabla Pr oduct a la variable
t abl e@MyTabl eVar . La tabla Pr oduct se utiliza en la clusula FROMpara especificar las filas que se van a eliminar. La clusula OUTPUT devuelve las columnas
del et ed. Pr oduct I Dy del et ed. Pr oduct Phot oI D, y la fecha y hora de eliminacin de la fila de la tabla Pr oduct Pr oduct Phot o a la aplicacin que realiza la llamada.
K.Insertar los datos devueltos por una clusula OUTPUT
El ejemplo siguiente captura datos devueltos por la clusula OUTPUT de una instruccin MERGE y los inserta en otra tabla. La instruccin MERGE actualiza diariamente la
columna Quant i t y de la tabla Pr oduct I nvent or y en funcin de los pedidos procesados en la tabla Sal esOr der Det ai l . Tambin elimina las filas correspondientes a
los productos cuyas existencias estn en el valor 0 o por debajo de este valor. En el ejemplo, se capturan las filas que se eliminan y se insertan en otra tabla,
Zer oI nvent or y, que realiza el seguimiento de los productos sin existencias.
USE Advent ur eWor ks2012 ;
GO
I F OBJ ECT_I D ( ' dbo. Empl oyeeSal es' , ' U' ) I S NOT NULL
DROP TABLE dbo. Empl oyeeSal es;
GO
CREATE TABLE dbo. Empl oyeeSal es
( Empl oyeeI D i nt I DENTI TY ( 1, 5) NOT NULL,
Last Name nvar char ( 20) NOT NULL,
Fi r st Name nvar char ( 20) NOT NULL,
Cur r ent Sal es money NOT NULL,
Pr oj ect edSal es AS Cur r ent Sal es * 1. 10
) ;
GO
DECLARE @MyTabl eVar t abl e(
Empl oyeeI D i nt NOT NULL,
Last Name nvar char ( 20) NOT NULL,
Fi r st Name nvar char ( 20) NOT NULL,
Cur r ent Sal es money NOT NULL,
Pr oj ect edSal es money NOT NULL
) ;
I NSERT I NTO dbo. Empl oyeeSal es ( Last Name, Fi r st Name, Cur r ent Sal es)
OUTPUT I NSERTED. Last Name,
I NSERTED. Fi r st Name,
I NSERTED. Cur r ent Sal es
I NTO @MyTabl eVar
SELECT c. Last Name, c. Fi r st Name, sp. Sal esYTD
FROMSal es. Sal esPer son AS sp
I NNER J OI N Per son. Per son AS c
ON sp. Busi nessEnt i t yI D =c. Busi nessEnt i t yI D
WHERE sp. Busi nessEnt i t yI D LI KE ' 2%'
ORDER BY c. Last Name, c. Fi r st Name;
SELECT Empl oyeeI D, Last Name, Fi r st Name, Cur r ent Sal es, Pr oj ect edSal es
FROM@MyTabl eVar ;
GO
SELECT Empl oyeeI D, Last Name, Fi r st Name, Cur r ent Sal es, Pr oj ect edSal es
FROMdbo. Empl oyeeSal es;
GO
USE Advent ur eWor ks2012;
GO
DECLARE @MyTabl eVar t abl e (
Pr oduct I D i nt NOT NULL,
Pr oduct Name nvar char ( 50) NOT NULL,
Pr oduct Model I D i nt NOT NULL,
Phot oI D i nt NOT NULL) ;
DELETE Pr oduct i on. Pr oduct Pr oduct Phot o
OUTPUT DELETED. Pr oduct I D,
p. Name,
p. Pr oduct Model I D,
DELETED. Pr oduct Phot oI D
I NTO @MyTabl eVar
OUTPUT DELETED. Pr oduct I D, DELETED. Pr oduct Phot oI D, GETDATE( ) AS Del et edDat e
FROMPr oduct i on. Pr oduct Pr oduct Phot o AS ph
J OI N Pr oduct i on. Pr oduct as p
ON ph. Pr oduct I D =p. Pr oduct I D
WHERE p. Pr oduct I D BETWEEN 800 and 810;
- - Di spl ay t he r esul t s of t he t abl e var i abl e.
SELECT Pr oduct I D, Pr oduct Name, Phot oI D, Pr oduct Model I D
FROM@MyTabl eVar ;
GO
USE Advent ur eWor ks2012;
GO
Vea tambin
Referencia
DELETE (Transact-SQL)
INSERT (Transact-SQL)
UPDATE (Transact-SQL)
table (Transact-SQL)
CREATE TRIGGER (Transact-SQL)
sp_configure (Transact-SQL)
2014 Microsoft
I F OBJ ECT_I D( N' Pr oduct i on. Zer oI nvent or y' , N' U' ) I S NOT NULL
DROP TABLE Pr oduct i on. Zer oI nvent or y;
GO
- - Cr eat e Zer oI nvent or y t abl e.
CREATE TABLE Pr oduct i on. Zer oI nvent or y ( Del et edPr oduct I D i nt , RemovedOnDat e Dat eTi me) ;
GO
I NSERT I NTO Pr oduct i on. Zer oI nvent or y ( Del et edPr oduct I D, RemovedOnDat e)
SELECT Pr oduct I D, GETDATE( )
FROM
( MERGE Pr oduct i on. Pr oduct I nvent or y AS pi
USI NG ( SELECT Pr oduct I D, SUM( Or der Qt y) FROMSal es. Sal esOr der Det ai l AS sod
J OI N Sal es. Sal esOr der Header AS soh
ON sod. Sal esOr der I D =soh. Sal esOr der I D
AND soh. Or der Dat e =' 20070401'
GROUP BY Pr oduct I D) AS sr c ( Pr oduct I D, Or der Qt y)
ON ( pi . Pr oduct I D =sr c. Pr oduct I D)
WHEN MATCHED AND pi . Quant i t y - sr c. Or der Qt y <=0
THEN DELETE
WHEN MATCHED
THEN UPDATE SET pi . Quant i t y =pi . Quant i t y - sr c. Or der Qt y
OUTPUT $act i on, del et ed. Pr oduct I D) AS Changes ( Act i on, Pr oduct I D)
WHERE Act i on =' DELETE' ;
I F @@ROWCOUNT =0
PRI NT ' War ni ng: No r ows wer e i nser t ed' ;
GO
SELECT Del et edPr oduct I D, RemovedOnDat e FROMPr oduct i on. Zer oI nvent or y;
READTEXT (Transact-SQL)
Lee los valores text, ntext o image de una columna text, ntext o image; comienza a partir de un desplazamiento especificado y lee el nmero de bytes determinado.
Importante
Esta caracterstica se quitar en una versin futura de Microsoft SQL Server. Evite utilizar esta caracterstica en nuevos trabajos de desarrollo y tenga previsto modificar
las aplicaciones que actualmente la utilizan. Utilice la funcin SUBSTRING en su lugar.
Se aplica a: SQL Server SQL Server 2008 a travs de la versin actual).
Convenciones de sintaxis de Transact-SQL
Sintaxis
Argumentos
table . column
Es el nombre de la tabla y de la columna donde se va a leer. Los nombres de tablas y columnas se deben ajustar a las reglas de los identificadores. Es necesario
especificar los nombres de la tabla y de la columna; sin embargo, es opcional especificar el nombre de la base de datos y del propietario.
text_ptr
Es un puntero de texto vlido. text_ptr debe ser de tipo binary(16).
offset
Es el nmero de bytes cuando se utilizan los tipos de datos text o image) o de caracteres (cuando se utiliza el tipo de datos ntext) que se va a omitir antes de
comenzar a leer los datos text, image o ntext.
size
Es el nmero de bytes cuando se utilizan los tipos de datos text o image) o de caracteres (cuando se utiliza el tipo de datos ntext) de los datos que se van a
leer. Si size es 0, se leen 4 KB de datos.
HOLDLOCK
Hace que se bloquee el valor de texto para lectura hasta el final de la transaccin. Otros usuarios pueden leer el valor, pero no pueden modificarlo.
Comentarios
Use la funcin TEXTPTR para obtener un valor de text_ptr vlido. TEXTPTR devuelve un puntero para la columna text, ntext o image de la fila especificada o para la
columna text, ntext o imagede la ltima fila devuelta por la consulta si devuelve ms de una fila. Debido a que TEXTPTR devuelve una cadena binaria de 16 bytes, se
recomienda declarar una variable local para que contenga el puntero de texto y, a continuacin, utilizar la variable con READTEXT. Para obtener ms informacin acerca
de la declaracin de una variable local, vea DECLARE @local_variable (Transact-SQL).
En SQL Server, pueden existir punteros de texto consecutivos, aunque quizs no sean vlidos. Par obtener ms informacin acerca de la opcin text in row, vea
sp_tableoption (Transact-SQL). Para obtener ms informacin acerca de la invalidacin de punteros de texto, vea sp_invalidate_textptr (Transact-SQL).
El valor de la funcin @@TEXTSIZE reemplaza el tamao especificado para READTEXT si es menor que ste. La funcin @@TEXTSIZE especifica el lmite que establece la
instruccin SET TEXTSIZE sobre el nmero de bytes de datos que se va a devolver. Para obtener ms informacin acerca de cmo establecer la configuracin de sesin
para TEXTSIZE, vea SET TEXTSIZE (Transact-SQL).
Permisos
Los permisos READTEXT se conceden de manera predeterminada a los usuarios con permisos SELECT para la tabla especificada. Los permisos se pueden transferir
cuando se transfieren los permisos SELECT.
Ejemplos
En el siguiente ejemplo se lee desde el carcter dos al veintisis de la columna pr _i nf o de la tabla pub_i nf o.
Nota
Para ejecutar este ejemplo, es necesario instalar la base de datos de ejemplo pubs.
SQL Server 2014
READTEXT { t abl e. col umn t ext _pt r of f set si ze } [ HOLDLOCK ]
Vea tambin
Referencia
@@TEXTSIZE (Transact-SQL)
UPDATETEXT (Transact-SQL)
WRITETEXT (Transact-SQL)
2014 Microsoft
USE pubs;
GO
DECLARE @pt r val var bi nar y( 16) ;
SELECT @pt r val =TEXTPTR( pr _i nf o)
FROMpub_i nf o pr I NNER J OI N publ i sher s p
ON pr . pub_i d =p. pub_i d
AND p. pub_name =' New Moon Books'
READTEXT pub_i nf o. pr _i nf o @pt r val 1 25;
GO
Condiciones de bsqueda TransactSQL
Es una combinacin de uno o varios predicados que utilizan los operadores lgicos AND, OR y NOT.
Se aplica a: SQL Server (desde SQL Server 2008 hasta la versin actual, Windows Azure SQL Database desde la versin inicial hasta la versin actual).
Convenciones de sintaxis de Transact-SQL
Sintaxis
Argumentos
<search_condition>
Especifica las condiciones de las filas devueltas en el conjunto de resultados de una instruccin SELECT, una expresin de consulta o una subconsulta. En una
instruccin UPDATE, especifica las filas que se van a actualizar. En una instruccin DELETE, especifica las filas que se van a eliminar. No hay lmite en el nmero de
predicados que se pueden incluir en una condicin de bsqueda de una instruccin TransactSQL.
NOT
Niega la expresin booleana que especifica el predicado. Para obtener ms informacin, vea NOT (Transact-SQL).
AND
Combina dos condiciones y se evala como TRUE cuando ambas condiciones son TRUE. Para obtener ms informacin, vea AND (Transact-SQL).
OR
Combina dos condiciones y se evala como TRUE cuando alguna de las condiciones es TRUE. Para obtener ms informacin, vea OR (Transact-SQL).
< predicate >
Es una expresin que devuelve TRUE, FALSE o UNKNOWN.
expression
Es un nombre de columna, una constante, una funcin, una variable, una subconsulta escalar o cualquier combinacin de nombres de columna, constantes y
funciones conectados mediante uno o varios operadores o una subconsulta. La expresin tambin puede contener la expresin CASE.
Nota
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 a la pgina de cdigos que se corresponde con la intercalacin predeterminada de la
base de datos o columna. Los caracteres que no se encuentren en esta pgina de cdigos se perdern.
=
Es el operador que se utiliza para probar la igualdad entre dos expresiones.
<>
Es el operador que se utiliza para probar si dos expresiones no son iguales entre s.
!=
Es el operador que se utiliza para probar si dos expresiones no son iguales entre s.
>
Es el operador que se utiliza para probar si una expresin es mayor que la otra.
>=
Es el operador que se utiliza para probar si una expresin es mayor o igual que la otra expresin.
!>
Es el operador que se utiliza para probar si una expresin no es mayor que la otra expresin.
<
SQL Server 2014
<sear ch_condi t i on>: : =
{ [ NOT ] <pr edi cat e>| ( <sear ch_condi t i on>) }
[ { AND | OR } [ NOT ] { <pr edi cat e>| ( <sear ch_condi t i on>) } ]
[ , . . . n ]
<pr edi cat e>: : =
{ expr essi on { =| <>| ! =| >| >=| ! >| <| <=| ! <} expr essi on
| st r i ng_expr essi on [ NOT ] LI KE st r i ng_expr essi on
[ ESCAPE ' escape_char act er ' ]
| expr essi on [ NOT ] BETWEEN expr essi on AND expr essi on
| expr essi on I S [ NOT ] NULL
| CONTAI NS
( { col umn | * } , ' <cont ai ns_sear ch_condi t i on>' )
| FREETEXT ( { col umn | * } , ' f r eet ext _st r i ng' )
| expr essi on [ NOT ] I N ( subquer y | expr essi on [ , . . . n ] )
| expr essi on { =| <>| ! =| >| >=| ! >| <| <=| ! <}
{ ALL | SOME | ANY} ( subquer y )
| EXI STS ( subquer y ) }
Es el operador que se utiliza para probar si una expresin es menor que la otra.
<=
Es el operador que se utiliza para probar si una expresin es menor o igual que la otra expresin.
!<
Es el operador que se utiliza para probar si una expresin no es menor que la otra expresin.
string_expression
Es una cadena de caracteres y caracteres comodn.
[ NOT ] LIKE
Indica que la siguiente cadena de caracteres se utilizar con la coincidencia de patrn. Para obtener ms informacin, vea LIKE (Transact-SQL).
ESCAPE 'escape_ character'
Permite buscar un carcter comodn en una cadena de caracteres sin que funcione como carcter comodn. escape_character es el carcter que se coloca delante
del carcter comodn para indicar este uso especial.
[ NOT ] BETWEEN
Especifica un intervalo inclusivo de valores. Utilice AND para separar los valores inicial y final. Para obtener ms informacin, vea BETWEEN (Transact-SQL).
IS [ NOT ] NULL
Especifica una bsqueda de valores NULL o de valores que no son NULL, en funcin de las palabras clave utilizadas. Una expresin que contenga un operador
bit a bit o aritmtico se evala como NULL si uno de los operandos es NULL.
CONTAINS
Busca en columnas que contengan datos basados en caracteres coincidencias precisas o menos precisas (parciales) con palabras o frases, a una cierta distancia
las unas de las otras y coincidencias ponderadas. Esta opcin solo puede usarse con instrucciones SELECT. Para obtener mas informacin, vea CONTAINS
(Transact-SQL).
FREETEXT
Proporciona una forma sencilla de realizar consultas en lenguaje natural al buscar, en columnas con datos basados en caracteres, valores que coincidan con el
significado en lugar de con las palabras exactas del predicado. Esta opcin solo puede usarse con instrucciones SELECT. Para obtener mas informacin, vea
FREETEXT (Transact-SQL).
[ NOT ] IN
Especifica la bsqueda de una expresin, basada en si la expresin est incluida en una lista o excluida de ella. La expresin de bsqueda puede ser una
constante o un nombre de columna, y la lista puede ser un conjunto de constantes o, ms normalmente, una subconsulta. Encierre la lista de valores entre
parntesis. Para obtener mas informacin, vea IN (Transact-SQL).
subquery
Se puede considerar como una instruccin SELECT restringida y es similar a <query_expresssion> en la instruccin SELECT. No se permiten la clusula ORDER BY
ni la palabra clave INTO. Para obtener ms informacin, vea SELECT (Transact-SQL).
ALL
Se utiliza con un operador de comparacin y una subconsulta. Devuelve TRUE para <predicate> si todos los valores obtenidos de la subconsulta satisfacen la
operacin de comparacin, o FALSE si no todos los valores satisfacen la comparacin o cuando la subconsulta no devuelve filas a la instruccin externa. Para
obtener ms informacin, vea ALL (Transact-SQL).
{SOME | ANY }
Se utiliza con un operador de comparacin y una subconsulta. Devuelve TRUE para <predicate> si algn valor obtenido de la subconsulta satisface el operador
de comparacin, o FALSE si ningn valor de la subconsulta satisface la comparacin o cuando la subconsulta no devuelve filas a la instruccin externa. En caso
contrario, la expresin es UNKNOWN. Para obtener ms informacin, vea SOME | ANY (Transact-SQL).
EXISTS
Se utiliza con una subconsulta para probar la existencia de filas devueltas por la subconsulta. Para obtener ms informacin, vea EXISTS (Transact-SQL).
Comentarios
El orden de prioridad de los operadores lgicos es NOT el ms alto, seguido de AND y OR. Se pueden utilizar parntesis para invalidar esta prioridad en una
condicin de bsqueda. El orden de evaluacin de los operadores lgicos puede variar dependiendo de las opciones elegidas por el optimizador de consultas. Para
obtener ms informacin acerca del funcionamiento de los operadores lgicos con valores lgicos, vea AND (Transact-SQL), OR (Transact-SQL) y NOT (Transact-SQL).
Ejemplos
A.Usar WHERE con la sintaxis de LIKE y ESCAPE
En el siguiente ejemplo se buscan filas en las que la columna Lar gePhot oFi l eName tenga los caracteres gr een_ y se utiliza la opcin ESCAPE porque _ es un carcter
comodn. Sin especificar la opcin ESCAPE, la consulta buscara los valores de descripcin que contuvieran la palabra gr een seguida de cualquier carcter distinto del
carcter _.
B.Usar la sintaxis de WHERE y LIKE con datos Unicode
USE Advent ur eWor ks2012 ;
GO
SELECT *
FROMPr oduct i on. Pr oduct Phot o
WHERE Lar gePhot oFi l eName LI KE ' %gr eena_%' ESCAPE ' a' ;
En el siguiente ejemplo se utiliza la clusula WHERE para recuperar la direccin de correo de una empresa que est fuera de los Estados Unidos US) y en una ciudad
cuyo nombre empieza con Pa.
Vea tambin
Referencia
Funciones de agregado (Transact-SQL)
CASE (Transact-SQL)
CONTAINSTABLE (Transact-SQL)
Cursores (Transact-SQL)
DELETE (Transact-SQL)
Expresiones (Transact-SQL)
FREETEXTTABLE (Transact-SQL)
FROM (Transact-SQL)
Operadores (Transact-SQL)
UPDATE (Transact-SQL)
2014 Microsoft
USE Advent ur eWor ks2012 ;
GO
SELECT Addr essLi ne1, Addr essLi ne2, Ci t y, Post al Code, Count r yRegi onCode
FROMPer son. Addr ess AS a
J OI N Per son. St at ePr ovi nce AS s ON a. St at ePr ovi nceI D =s. St at ePr ovi nceI D
WHERE Count r yRegi onCode NOT I N ( ' US' )
AND Ci t y LI KE N' Pa%' ;
SELECT (Transact-SQL)
Recupera filas de la base de datos y habilita la seleccin de una o varias filas o columnas de una o varias tablas en SQL Server. La sintaxis completa de la instruccin
SELECT es compleja, aunque las clusulas principales se pueden resumir del modo siguiente:
[ WITH <common_table_expression>]
SELECT select_list [ INTO new_table ]
[ FROM table_source ] [ WHERE search_condition ]
[ GROUP BY group_by_expression ]
[ HAVING search_condition ]
[ ORDER BY order_expression [ ASC | DESC ] ]
Los operadores UNION, EXCEPT e INTERSECT se pueden utilizar entre consultas para combinar o comparar resultados en un conjunto de resultados.
Se aplica a: SQL Server (desde SQL Server 2008 hasta la versin actual, Windows Azure SQL Database desde la versin inicial hasta la versin actual).
Convenciones de sintaxis de Transact-SQL
Sintaxis
Comentarios
Debido a la complejidad de la instruccin SELECT, se muestran elementos y argumentos detallados de la sintaxis de cada clusula:
WITH common_table_expression HAVING
Clusula SELECT UNION
Clusula INTO EXCEPT e INTERSECT
FROM ORDER BY
WHERE Clusula FOR
GROUP BY Clusula OPTION
El orden de las clusulas en la instruccin SELECT es importante. Se puede omitir cualquiera de las clusulas opcionales pero, cuando se utilizan, deben aparecer en el
orden apropiado.
Las instrucciones SELECT se permiten en las funciones definidas por el usuario solo si las listas de seleccin de estas instrucciones contienen expresiones que asignan
valores a variables locales de las funciones.
Un nombre de cuatro partes creado con la funcin OPENDATASOURCE como la parte de nombre de servidor se puede utilizar como origen de tabla en todos los
lugares de las instrucciones SELECT donde pueda aparecer un nombre de tabla. No se puede especificar un nombre de cuatro partes para Windows Azure SQL
Database.
Existen algunas restricciones sintcticas en las instrucciones SELECT relacionadas con las tablas remotas.
SQL Server 2014
<SELECT st at ement >: : =
[ WI TH <common_t abl e_expr essi on>[ , . . . n] ]
<quer y_expr essi on>
[ ORDER BY { or der _by_expr essi on | col umn_posi t i on [ ASC | DESC ] }
[ , . . . n ] ]
[ <FOR Cl ause>]
[ OPTI ON ( <quer y_hi nt >[ , . . . n ] ) ]
<quer y_expr essi on>: : =
{ <quer y_speci f i cat i on>| ( <quer y_expr essi on>) }
[ { UNI ON [ ALL ] | EXCEPT | I NTERSECT }
<quer y_speci f i cat i on>| ( <quer y_expr essi on>) [ . . . n ] ]
<quer y_speci f i cat i on>: : =
SELECT [ ALL | DI STI NCT ]
[ TOP ( expr essi on ) [ PERCENT] [ WI TH TI ES ] ]
<sel ect _l i st >
[ I NTO new_t abl e ]
[ FROM{ <t abl e_sour ce>} [ , . . . n ] ]
[ WHERE <sear ch_condi t i on>]
[ <GROUP BY>]
[ HAVI NG <sear ch_condi t i on >]
Orden de procesamiento lgico de la instruccin SELECT
Los pasos siguientes muestran el orden de procesamiento lgico, u orden de enlaces, de una instruccin SELECT. Este orden determina cundo los objetos definidos en
un paso estn disponibles para las clusulas en pasos posteriores. Por ejemplo, si el procesador de consultas puede enlazar (obtener acceso) a las tablas o las vistas
definidas en la clusula FROM, estos objetos y sus columnas estn disponibles para todos los pasos siguientes. Por el contrario, dado que la clusula SELECT es el
paso 8, las clusulas anteriores no pueden hacer referencia a los alias de columna o columnas derivadas definidas en esa clusula. Sin embargo, las clusulas
siguientes, tales como la clusula ORDER BY, s pueden hacer referencia. Observe que la ejecucin fsica real de la instruccin est determinada por el procesador de
consultas y el orden puede variar en esta lista.
1. FROM
2. ON
3. JOIN
4. WHERE
5. GROUP BY
6. WITH CUBE o WITH ROLLUP
7. HAVING
8. SELECT
9. DISTINCT
10. ORDER BY
11. TOP
Permisos
La seleccin de datos necesita el permiso SELECT en la tabla o en la vista, que se puede heredar de un mbito superior como el permiso SELECT en el esquema o el
permiso CONTROL en la tabla. O bien, se necesita pertenecer a los roles fijos de base de datos db_datareader o db_owner, o al rol fijo de servidor sysadmin. La
creacin de una nueva tabla mediante SELECTINTO tambin necesita tanto el permiso CREATETABLE como el permiso ALTERSCHEMA en el esquema al que pertenece
la nueva tabla.
Vea tambin
Referencia
Ejemplos de SELECT (Transact-SQL)
2014 Microsoft
Constructor con valores de tabla (Transact-SQL)
Especifica un conjunto de expresiones de valores de fila que se va a construir en una tabla. El constructor de valor de tabla de Transact-SQL permite que se especifiquen
varias filas de datos en una sola instruccin DML. El constructor del valor de tabla se puede especificar en la clusula VALUES de la instruccin INSERT, en la clusula
USING <tabla de origen> de la instruccin MERGE y en la definicin de una tabla derivada en la clusula FROM.
Se aplica a: SQL Server (SQL Server 2008 a versin actual, Windows Azure SQL Database Versin inicial a versin actual).
Convenciones de sintaxis de Transact-SQL
Sintaxis
Argumentos
VALUES
Introduce las listas de expresin de los valores de las filas. Cada lista debe aparecer entre parntesis y separarse mediante una coma.
El nmero de valores especificados en cada lista debe ser el mismo y los valores deben estar en el mismo orden que las columnas de la tabla. Se debe
especificar un valor para cada columna de la tabla o la lista de columnas debe especificar explcitamente las columnas para cada valor entrante.
DEFAULT
Hace que Motor de base de datos inserte el valor predeterminado definido para una columna. Si no existe ningn valor predeterminado para la columna y esta
admite valores NULL, se inserta NULL. DEFAULT no es un valor vlido para una columna de identidad. Cuando se especifica en un constructor con valores de
tabla, DEFAULT solo se permite en una instruccin INSERT.
expression
Es una constante, variable o expresin. La expresin no puede contener una instruccin EXECUTE.
Limitaciones y restricciones
Los constructores con valores de tabla pueden utilizarse de una de dos maneras: directamente en la lista VALUES de una instruccin INSERT VALUES o como una
tabla derivada donde las tablas derivadas estn permitidas. El nmero mximo de filas que pueden construirse insertando filas directamente en la lista de valores es
1000. Se devuelve el error 10738 si el nmero de filas es superior a 1000 en ese caso. Para insertar ms de 1000 filas, use uno de los mtodos siguientes:
Crear varias instrucciones INSERT
Usar una tabla derivada
Importar masivamente los datos mediante la utilidad de bcp o la instruccin BULK INSERT
Como expresin de valores de fila solo se permiten valores escalares. Como expresin de valores de fila no se permiten las subconsultas que impliquen a varias
columnas. Por ejemplo, el cdigo siguiente produce un error de sintaxis porque la tercera lista de expresiones de valores de fila contiene una subconsulta con varias
columnas.
Sin embargo, la instruccin se puede reescribir especificando cada columna en la subconsulta independientemente. El ejemplo siguiente inserta correctamente tres filas
en la tabla MyPr oduct s.
SQL Server 2014
VALUES ( <r ow val ue expr essi on l i st >) [ , . . . n ]
<r ow val ue expr essi on l i st >: : =
{<r ow val ue expr essi on>} [ , . . . n ]
<r ow val ue expr essi on>: : =
{ DEFAULT | NULL | expr essi on }
USE Advent ur eWor ks2012;
GO
CREATE TABLE dbo. MyPr oduct s ( Name var char ( 50) , Li st Pr i ce money) ;
GO
- - Thi s st at ement f ai l s because t he t hi r d val ues l i st cont ai ns mul t i pl e col umns i n t he subquer y.
I NSERT I NTO dbo. MyPr oduct s ( Name, Li st Pr i ce)
VALUES ( ' Hel met ' , 25. 50) ,
( ' Wheel ' , 30. 00) ,
( SELECT Name, Li st Pr i ce FROMPr oduct i on. Pr oduct WHERE Pr oduct I D =720) ;
GO
Tipos de datos
Los valores especificados en una instruccin INSERT de varias filas siguen las propiedades de conversin de tipos de datos de la sintaxis de UNION ALL. Esto produce
la conversin implcita de tipos no coincidentes al tipo de precedencia superior. Si la conversin no es una conversin implcita admitida, se devuelve un error. Por
ejemplo, la instruccin siguiente inserta un valor entero y un valor de carcter en una columna de tipo char.
Cuando se ejecuta la instruccin INSERT, SQL Server intenta convertir 'a' en un entero porque la precedencia del tipo de datos indica que un entero pertenece a un tipo
ms alto que un carcter. Se produce un error en la conversin y se devuelve un error. Para evitar este error, puede convertir explcitamente los valores segn
corresponda. Por ejemplo, la instruccin anterior puede escribirse del siguiente modo.
Ejemplos
A.Insertar varias filas de datos
En el siguiente ejemplo se crea la tabla dbo. Depar t ment s y, a continuacin, se utiliza el constructor de valor de tabla para insertar cinco filas en la tabla. 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.
B.Insertar varias filas con los valores DEFAULT y NULL
En el siguiente ejemplo se demuestra cmo especificar DEFAULT y NULL cuando se utiliza el constructor de valor de tabla para insertar filas en una tabla.
C.Especificar varios valores como una tabla derivada en una clusula FROM
En los siguientes ejemplos se utiliza el constructor con valores de tabla para especificar varios valores en la clusula FROM de una instruccin SELECT.
D.Especificar varios valores como una tabla de origen derivada en una instruccin MERGE
I NSERT I NTO dbo. MyPr oduct s ( Name, Li st Pr i ce)
VALUES ( ' Hel met ' , 25. 50) ,
( ' Wheel ' , 30. 00) ,
( ( SELECT Name FROMPr oduct i on. Pr oduct WHERE Pr oduct I D =720) ,
( SELECT Li st Pr i ce FROMPr oduct i on. Pr oduct WHERE Pr oduct I D =720) ) ;
GO
CREATE TABLE dbo. t ( a i nt , b char ) ;
GO
I NSERT I NTO dbo. t VALUES ( 1, ' a' ) , ( 2, 1) ;
GO
I NSERT I NTO dbo. t VALUES ( 1, ' a' ) , ( 2, CONVERT( CHAR, 1) ) ;
USE Advent ur eWor ks2012;
GO
I NSERT I NTO Pr oduct i on. Uni t Measur e
VALUES ( N' FT2' , N' Squar e Feet ' , ' 20080923' ) , ( N' Y' , N' Yar ds' , ' 20080923' ) , ( N' Y3' , N' Cubi c Yar ds' , ' 20080923' ) ;
GO
USE Advent ur eWor ks2012;
GO
CREATE TABLE Sal es. MySal esReason(
Sal esReasonI D i nt I DENTI TY( 1, 1) NOT NULL,
Name dbo. Name NULL ,
ReasonType dbo. Name NOT NULL DEFAULT ' Not Appl i cabl e' ) ;
GO
I NSERT I NTO Sal es. MySal esReason
VALUES ( ' Recommendat i on' , ' Ot her ' ) , ( ' Adver t i sement ' , DEFAULT) , ( NULL, ' Pr omot i on' ) ;
SELECT * FROMSal es. MySal esReason;
SELECT a, b FROM( VALUES ( 1, 2) , ( 3, 4) , ( 5, 6) , ( 7, 8) , ( 9, 10) ) AS MyTabl e( a, b) ;
GO
- - Used i n an i nner j oi n t o speci f y val ues t o r et ur n.
SELECT Pr oduct I D, a. Name, Col or
FROMPr oduct i on. Pr oduct AS a
I NNER J OI N ( VALUES ( ' Bl ade' ) , ( ' Cr own Race' ) , ( ' AWC Logo Cap' ) ) AS b( Name)
ON a. Name =b. Name;
En el ejemplo siguiente se usa MERGE para modificar la tabla Sal esReason, actualizando o insertando las filas. Cuando el valor de NewName de la tabla de origen
coincide con un valor de la columna Name de la tabla de destino, (Sal esReason), la columna ReasonType se actualiza en la tabla de destino. Cuando el valor de NewName
no coincide, la fila del origen se inserta en la tabla de destino. La tabla de origen es una tabla derivada que usa la caracterstica de constructor con valores de tabla de
Transact-SQL para especificar varias filas en la tabla de origen.
Vea tambin
Referencia
INSERT (Transact-SQL)
MERGE (Transact-SQL)
FROM (Transact-SQL)
2014 Microsoft
USE Advent ur eWor ks2012;
GO
- - Cr eat e a t empor ar y t abl e var i abl e t o hol d t he out put act i ons.
DECLARE @Summar yOf Changes TABLE( Change VARCHAR( 20) ) ;
MERGE I NTO Sal es. Sal esReason AS Tar get
USI NG ( VALUES ( ' Recommendat i on' , ' Ot her ' ) , ( ' Revi ew' , ' Mar ket i ng' ) , ( ' I nt er net ' , ' Pr omot i on' ) )
AS Sour ce ( NewName, NewReasonType)
ON Tar get . Name =Sour ce. NewName
WHEN MATCHED THEN
UPDATE SET ReasonType =Sour ce. NewReasonType
WHEN NOT MATCHED BY TARGET THEN
I NSERT ( Name, ReasonType) VALUES ( NewName, NewReasonType)
OUTPUT $act i on I NTO @Summar yOf Changes;
- - Quer y t he r esul t s of t he t abl e var i abl e.
SELECT Change, COUNT( *) AS Count Per Change
FROM@Summar yOf Changes
GROUP BY Change;
TOP (Transact-SQL)
Limita las filas devueltas en un conjunto de resultados de la consulta a un nmero o porcentaje de filas especificado en SQL Server 2014. Cuando se usa TOP junto con la
clusula ORDER BY, el conjunto de resultados se limita al primer nmero N de filas ordenadas; de lo contrario, devuelve el primer nmero N de filas en un orden sin
definir. Utilice esta clusula para especificar el nmero de filas devueltas de una instruccin SELECT o afectadas por una instruccin INSERT, UPDATE, MERGE o DELETE.
Se aplica a: SQL Server (SQL Server 2008 a versin actual, Windows Azure SQL Database Versin inicial a versin actual).
Convenciones de sintaxis de Transact-SQL
Sintaxis
Argumentos
expression
Es la expresin numrica vlida que especifica el nmero de filas que se van a devolver. Si se especifica PERCENT, expression se convierte implcitamente a un
valor float; en caso contrario, se convierte en bigint.
PERCENT
Indica que la consulta devuelve slo el primer porcentaje de filas de expression del conjunto de resultados. Los valores fraccionarios se redondean al siguiente
valor entero.
WITH TIES
Se usa cuando se desean devolver dos o ms filas que ocupan el ltimo lugar en el conjunto de resultados limitado. Se debe usar con la clusula ORDER BY.
WITH TIES puede hacer que se devuelvan ms filas que el valor especificado en expression. Por ejemplo, si expression est establecido en 5, pero 2 filas
adicionales coinciden con los valores de las columnas ORDER BY en la fila 5, el conjunto de resultados contendr 7 filas.
TOP...WITH TIES solo se puede especificar en instrucciones SELECT y siempre que se haya especificado una clusula ORDER BY. El orden devuelto de los registros
enlazados es arbitrario. ORDER BY no afecta a esta regla.
Prcticas recomendadas
En una instruccin SELECT, utilice siempre una clusula ORDER BY con la clusula TOP. Esta es la nica manera de indicar previsiblemente a qu filas afecta TOP.
Utilice OFFSET y FETCH en la clusula ORDER BY en lugar de la clusula TOP para implementar una solucin de paginacin de consulta. Una solucin de paginacin es
decir, el envo de fragmentos o "pginas" de datos al cliente es ms fcil de implementar mediante OFFSET y FETCH. Para obtener ms informacin, consulte ORDER BY
clusula de TransactSQL.
Utilice TOP o bien, OFFSET y FETCH en lugar de SET ROWCOUNT para limitar el nmero de filas devueltas. Estos mtodos son preferibles a utilizar SET ROWCOUNT
por las siguientes razones:
Como parte de una instruccin SELECT, el optimizador de consultas puede considerar el valor de expression en las clusulas TOP o FETCH durante la optimizacin
de la consulta. Dado que SET ROWCOUNT se usa fuera de una instruccin que ejecuta una consulta, su valor no se puede considerar en un plan de consulta.
Soporte de compatibilidad
Por compatibilidad con versiones anteriores, los parntesis son opcionales en las instrucciones SELECT. Se recomienda utilizar siempre los parntesis para TOP en las
instrucciones SELECT por coherencia con su uso necesario en las instrucciones INSERT, UPDATE, MERGE y DELETE, en las que se requieren los parntesis.
Interoperabilidad
La expresin TOP no afecta a las instrucciones que se pueden ejecutar debido a un desencadenador. Las tablas inserted y deleted en los desencadenadores solo
mostrarn las filas verdaderamente afectadas por las instrucciones INSERT, UPDATE, MERGE o DELETE. Por ejemplo, si INSERT TRIGGER se desencadena como
resultado de una instruccin INSERT que utiliz una clusula TOP,
SQL Server permite actualizar las filas a travs de las vistas. Dado que la clusula TOP puede estar incluida en la definicin de vista, es posible que algunas filas
desaparezcan de la vista a causa de una actualizacin si las filas ya no cumplen con los requisitos de la expresin TOP.
Cuando se especifica en la instruccin MERGE, la clusula TOP se aplica despus de que se combinen la tabla de origen completa y la tabla de destino completa y de
que se quiten las filas combinadas que no certifican las acciones de insercin, actualizacin o eliminacin. La clusula TOP reduce an ms el nmero de filas
SQL Server 2014
[
TOP ( expr essi on) [ PERCENT]
[ WI TH TI ES ]
]
combinadas al valor especificado y se aplican las acciones de insercin, actualizacin o eliminacin a las filas combinadas restantes de una manera desordenada. Es
decir, no hay ningn orden en el que las filas se distribuyan entre las acciones definidas en las clusulas WHEN. Por ejemplo, si especificar TOP (10) afecta a 10 filas; de
estas filas, se pueden actualizar 7 e insertar 3, o se pueden eliminar 1, actualizar 5 e insertar 4, etc. Dado que la instruccin MERGE realiza exmenes de tabla
completos de ambas tablas, de destino y de origen, el rendimiento de E/S puede verse afectado al utilizar la clusula TOP para modificar una tabla grande mediante la
creacin de varios lotes. En este escenario, es importante asegurase de que todos los lotes sucesivos tengan como destino nuevas filas.
Tenga precaucin al especificar la clusula TOP en una consulta que contiene un operador UNION, UNION ALL, EXCEPT o INTERSECT. Es posible escribir una consulta
que devuelva resultados inesperados porque el orden en el que se procesan lgicamente las clusulas TOP y ORDER BY no siempre es intuitivo cuando estos
operadores se utilizan en una operacin Select. Por ejemplo, dados los siguientes datos y la siguiente tabla, suponga que desea devolver el coche rojo menos caro y el
coche azul menos caro. Es decir, el sedn rojo y la camioneta azul.
Para lograr estos resultados, podra escribir la siguiente consulta.
El conjunto de resultados es el siguiente.
Model Col or Pr i ce
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
sedan r ed 10000. 00
conver t i bl e bl ue 15000. 00
Se devuelven resultados inesperados porque la clusula TOP se ejecuta lgicamente antes que la clusula ORDER BY, que ordena los resultados del operador UNION
ALL en este caso). As, la consulta anterior devuelve cualquier coche rojo y cualquier coche azul y, a continuacin, ordena el resultado de esa unin por el precio. En el
siguiente ejemplo se muestra el mtodo correcto de escribir esta consulta para lograr el resultado deseado.
Utilizando TOP y ORDER BY en una operacin de subseleccin, se puede asegurar de que los resultados de la clusula ORDER BY que se utilizan se apliquen a la
clusula TOP y no a ordenar el resultado de la operacin UNION.
El conjunto de resultados es el siguiente.
Model Col or Pr i ce
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
sedan r ed 10000. 00
van bl ue 8000. 00
Limitaciones y restricciones
Cuando se utiliza TOP con INSERT, UPDATE, MERGE o 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 estas instrucciones. Si necesita usar TOP para insertar, eliminar o modificar las filas en un orden cronolgico significativo, debe
utilizar TOP junto con una clusula ORDER BY que se especifica en una instruccin de subseleccin. Consulte la seccin Ejemplos siguiente en este tema.
TOP no se puede usar en las instrucciones UPDATE y DELETE en vistas con particiones.
TOP no se puede combinar con OFFSET y FETCH en la misma expresin de consulta en el mismo mbito de la consulta. Para obtener ms informacin, vea ORDER BY
clusula de TransactSQL.
CREATE TABLE dbo. Car s( Model var char ( 15) , Pr i ce money, Col or var char ( 10) ) ;
I NSERT dbo. Car s VALUES
( ' sedan' , 10000, ' r ed' ) , ( ' conver t i bl e' , 15000, ' bl ue' ) ,
( ' coupe' , 20000, ' r ed' ) , ( ' van' , 8000, ' bl ue' ) ;
SELECT TOP( 1) Model , Col or , Pr i ce
FROMdbo. Car s
WHERE Col or =' r ed'
UNI ON ALL
SELECT TOP( 1) Model , Col or , Pr i ce
FROMdbo. Car s
WHERE Col or =' bl ue'
ORDER BY Pr i ce ASC;
SELECT Model , Col or , Pr i ce
FROM( SELECT TOP( 1) Model , Col or , Pr i ce
FROMdbo. Car s
WHERE Col or =' r ed'
ORDER BY Pr i ce ASC) AS a
UNI ON ALL
SELECT Model , Col or , Pr i ce
FROM( SELECT TOP( 1) Model , Col or , Pr i ce
FROMdbo. Car s
WHERE Col or =' bl ue'
ORDER BY Pr i ce ASC) AS b;
Ejemplos
Categora Elementos de sintaxis ofrecidos
Sintaxis bsica TOP PERCENT
Incluir valores equivalentes WITH TIES
Limitar las filas afectadas por DELETE, INSERT o UPDATE DELETE INSERT UPDATE
Sintaxis bsica
En los ejemplos de esta seccin se muestra la funcionalidad bsica de la clusula ORDER BY con la sintaxis mnima requerida.
A.Utilizar TOP con un valor constante
En los siguientes ejemplos se utiliza un valor constante para especificar el nmero de empleados que se devuelven en el conjunto de resultados de la consulta. En el
primer ejemplo, se devuelven las 10 primeras filas sin definir porque no se usa una clusula ORDER BY. En el segundo ejemplo, se utiliza una clusula ORDER BY para
devolver los primeros 10 empleados contratados recientemente.
B.Usar TOP con una variable
En el siguiente ejemplo se utiliza una variable para especificar el nmero de empleados que se devuelven en el conjunto de resultados de la consulta.
C.Especificar un porcentaje
En el siguiente ejemplo se utiliza PERCENT para especificar el nmero de empleados que se devuelven en el conjunto de resultados de la consulta. Hay 290 empleados
en la tabla HumanResour ces. Empl oyee. Dado que el 5 por ciento de 290 es un valor fraccionario, el valor se redondea al nmero entero siguiente.
Incluir valores equivalentes
A.Utilizar WITH TIES para incluir las filas que coinciden con los valores de la ltima fila
En el ejemplo siguiente se obtiene el primer 10 por ciento de los empleados que tienen los salarios ms altos y se devuelven en orden descendente de acuerdo con su
salario. La especificacin de WI TH TI ES garantiza que tambin se incluyan en el conjunto de resultados los empleados con salarios iguales al salario ms bajo devuelto
la ltima fila, aun cuando esto exceda el 10 por ciento de los empleados.
Limitar las filas afectadas por DELETE, INSERT o UPDATE
A.Utilizar TOP para limitar el nmero de filas eliminadas
USE Advent ur eWor ks2012;
GO
- - Sel ect t he f i r st 10 r andomempl oyees.
SELECT TOP( 10) J obTi t l e, Hi r eDat e
FROMHumanResour ces. Empl oyee;
GO
- - Sel ect t he f i r st 10 empl oyees hi r ed most r ecent l y.
SELECT TOP( 10) J obTi t l e, Hi r eDat e
FROMHumanResour ces. Empl oyee
ORDER BY Hi r eDat e DESC;
USE Advent ur eWor ks2012;
GO
DECLARE @p AS i nt =10;
SELECT TOP( @p) J obTi t l e, Hi r eDat e, Vacat i onHour s
FROMHumanResour ces. Empl oyee
ORDER BY Vacat i onHour s DESC
GO
USE Advent ur eWor ks2012;
GO
SELECT TOP( 5) PERCENT J obTi t l e, Hi r eDat e
FROMHumanResour ces. Empl oyee
ORDER BY Hi r eDat e DESC;
USE Advent ur eWor ks2012;
GO
SELECT TOP( 10) WI TH TI ES
pp. Fi r st Name, pp. Last Name, e. J obTi t l e, e. Gender , r . Rat e
FROMPer son. Per son AS pp
I NNER J OI N HumanResour ces. Empl oyee AS e
ON pp. Busi nessEnt i t yI D =e. Busi nessEnt i t yI D
I NNER J OI N HumanResour ces. Empl oyeePayHi st or y AS r
ON r . Busi nessEnt i t yI D =e. Busi nessEnt i t yI D
ORDER BY Rat e DESC;
Cuando se usa una clusula TOP n con DELETE, la operacin de eliminacin se realiza en una seleccin sin definir de n nmero de filas. Es decir, la instruccin DELETE
elige cualquier nmero n de filas que cumplen los criterios definidos en la clusula WHERE. En el ejemplo siguiente se eliminan 20 filas de la tabla
Pur chaseOr der Det ai l cuyas fechas de vencimiento son anteriores al 1 de julio de 2002.
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 Pur chaseOr der Det ai l 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 Pur chaseOr der I D) 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.
B.Utilizar TOP para limitar el nmero de filas insertadas
En el ejemplo siguiente se crea la tabla Empl oyeeSal es y se inserta el nombre y los datos de ventas del ao hasta la fecha para los 5 primeros empleados de la tabla
HumanResour ces. Empl oyee. La instruccin INSERT elige 5 filas cualesquiera devuelvas por la instruccin SELECT que cumplen los criterios definidos en la clusula
WHERE. La clusula OUTPUT muestra las filas que se insertan en la tabla Empl oyeeSal es. Observe que la clusula ORDER BY de la instruccin SELECT no se utiliza para
determinar los primeros 5 empleados.
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 Empl oyeeSal es. Observe que los 5 primeros empleados se insertan
ahora segn los resultados de la clusula ORDER BY en lugar de las filas sin definir.
C.Utilizar TOP para limitar el nmero de filas actualizadas
En el ejemplo siguiente se usa la clusula TOP para actualizar filas de una tabla. Cuando se usa una clusula TOP n con UPDATE, la operacin de actualizacin se
realiza sobre un nmero sin definir de filas. Es decir, la instruccin UPDATE elige cualquier nmero n de filas que cumplen los criterios definidos en la clusula WHERE.
En el ejemplo siguiente se asignan 10 clientes de un vendedor a otro.
USE Advent ur eWor ks2012;
GO
DELETE TOP ( 20)
FROMPur chasi ng. Pur chaseOr der Det ai l
WHERE DueDat e <' 20020701' ;
GO
USE Advent ur eWor ks2012;
GO
DELETE FROMPur chasi ng. Pur chaseOr der Det ai l
WHERE Pur chaseOr der Det ai l I D I N
( SELECT TOP 10 Pur chaseOr der Det ai l I D
FROMPur chasi ng. Pur chaseOr der Det ai l
ORDER BY DueDat e ASC) ;
GO
USE Advent ur eWor ks2012 ;
GO
I F OBJ ECT_I D ( ' dbo. Empl oyeeSal es' , ' U' ) I S NOT NULL
DROP TABLE dbo. Empl oyeeSal es;
GO
CREATE TABLE dbo. Empl oyeeSal es
( Empl oyeeI D nvar char ( 11) NOT NULL,
Last Name nvar char ( 20) NOT NULL,
Fi r st Name nvar char ( 20) NOT NULL,
Year l ySal es money NOT NULL
) ;
GO
I NSERT TOP( 5) I NTO dbo. Empl oyeeSal es
OUTPUT i nser t ed. Empl oyeeI D, i nser t ed. Fi r st Name, i nser t ed. Last Name, i nser t ed. Year l ySal es
SELECT sp. Busi nessEnt i t yI D, c. Last Name, c. Fi r st Name, sp. Sal esYTD
FROMSal es. Sal esPer son AS sp
I NNER J OI N Per son. Per son AS c
ON sp. Busi nessEnt i t yI D =c. Busi nessEnt i t yI D
WHERE sp. Sal esYTD >250000. 00
ORDER BY sp. Sal esYTD DESC;
I NSERT I NTO dbo. Empl oyeeSal es
OUTPUT i nser t ed. Empl oyeeI D, i nser t ed. Fi r st Name, i nser t ed. Last Name, i nser t ed. Year l ySal es
SELECT TOP ( 5) sp. Busi nessEnt i t yI D, c. Last Name, c. Fi r st Name, sp. Sal esYTD
FROMSal es. Sal esPer son AS sp
I NNER J OI N Per son. Per son AS c
ON sp. Busi nessEnt i t yI D =c. Busi nessEnt i t yI D
WHERE sp. Sal esYTD >250000. 00
ORDER BY sp. Sal esYTD DESC;
USE Advent ur eWor ks2012;
UPDATE TOP ( 10) Sal es. St or e
SET Sal esPer sonI D =276
Si necesita usar TOP para aplicar actualizaciones segn un orden cronolgico significativo, debe usar TOP 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.
Vea tambin
Referencia
SELECT (Transact-SQL)
INSERT (Transact-SQL)
UPDATE (Transact-SQL)
DELETE (Transact-SQL)
ORDER BY clusula de TransactSQL
SET ROWCOUNT (Transact-SQL)
MERGE (Transact-SQL)
2014 Microsoft
WHERE Sal esPer sonI D =275;
GO
UPDATE HumanResour ces. Empl oyee
SET Vacat i onHour s =Vacat i onHour s +8
FROM( SELECT TOP 10 Busi nessEnt i t yI D FROMHumanResour ces. Empl oyee
ORDER BY Hi r eDat e ASC) AS t h
WHERE HumanResour ces. Empl oyee. Busi nessEnt i t yI D =t h. Busi nessEnt i t yI D;
GO
UPDATE (Transact-SQL)
Cambia los datos de una tabla o vista de SQL Server 2014. Para obtener ejemplos, vea Ejemplos.
Se aplica a: SQL Server (SQL Server 2008 a versin actual, Windows Azure SQL Database Versin inicial a versin actual).
Convenciones de sintaxis de Transact-SQL
Sintaxis
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
SQL Server 2014
[ WI TH <common_t abl e_expr essi on>[ . . . n] ]
UPDATE
[ TOP ( expr essi on ) [ PERCENT ] ]
{ { t abl e_al i as | <obj ect >| r owset _f unct i on_l i mi t ed
[ WI TH ( <Tabl e_Hi nt _Li mi t ed>[ . . . n ] ) ]
}
| @t abl e_var i abl e
}
SET
{ col umn_name ={ expr essi on | DEFAULT | NULL }
| { udt _col umn_name. { { pr oper t y_name =expr essi on
| f i el d_name =expr essi on }
| met hod_name ( ar gument [ , . . . n ] )
}
}
| col umn_name { . WRI TE ( expr essi on , @Of f set , @Lengt h ) }
| @var i abl e =expr essi on
| @var i abl e =col umn =expr essi on
| col umn_name { +=| - =| *=| / =| %=| &=| ^=| | =} expr essi on
| @var i abl e { +=| - =| *=| / =| %=| &=| ^=| | =} expr essi on
| @var i abl e =col umn { +=| - =| *=| / =| %=| &=| ^=| | =} expr essi on
} [ , . . . n ]
[ <OUTPUT Cl ause>]
[ FROM{ <t abl e_sour ce>} [ , . . . n ] ]
[ WHERE { <sear ch_condi t i on>
| { [ CURRENT OF
{ { [ GLOBAL ] cur sor _name }
| cur sor _var i abl e_name
}
]
}
}
]
[ OPTI ON ( <quer y_hi nt >[ , . . . n ] ) ]
[ ; ]
<obj ect >: : =
{
[ ser ver _name . dat abase_name . schema_name .
| dat abase_name . [ schema_name ] .
| schema_name .
]
t abl e_or _vi ew_name}
Transact-SQL
Es el nombre del servidor un nombre de servidor vinculado o la funcin OPENDATASOURCE como nombre de servidor) en el que se encuentra la tabla o la
vista. Si se especifica server_name, son obligatorios database_name y schema_name.
database_name
Es el nombre de la base de datos.
schema_name
Es el nombre del esquema al que pertenece la tabla o vista.
table_or view_name
Es el nombre de la tabla o vista cuyas filas se deben actualizar. La vista a la que hace referencia table_or_view_name debe poder actualizarse y debe hacer
referencia exactamente a una tabla base en la clusula FROM de la vista. Para obtener ms informacin acerca de las vistas que se pueden actualizar, vea
CREATE VIEW (Transact-SQL).
rowset_function_limited
Es la funcin OPENQUERY u OPENROWSET, dependiendo de las funciones del proveedor.
WITH ( <Table_Hint_Limited> )
Especifica una o varias sugerencias de tabla que estn permitidas en una tabla de destino. La palabra clave WITH y los parntesis son obligatorios. No se
permiten NOLOCK ni READUNCOMMITTED. Para obtener ms informacin acerca de las sugerencias de tabla, vea Sugerencias de tabla (Transact-SQL).
@table_variable
Especifica una variable table como origen de la tabla.
SET
Especifica la lista de nombres de variable o de columna que se van a actualizar.
column_name
Es una columna que contiene los datos que se van a cambiar. column_name debe existir en table_or view_name. Las columnas de identidad no se pueden
actualizar.
expression
Es una variable, un valor literal, una expresin o una instruccin de subseleccin entre parntesis que devuelve un solo valor. El valor devuelto por expression
sustituye al valor existente en column_name o @variable.
Nota
Cuando se hace referencia a los tipos de datos de caracteres Unicode nchar, nvarchar y ntext, debe agregarse como prefijo la letra mayscula 'N' a
'expression'. Si no se especifica 'N', SQL Server convierte la cadena a la pgina de cdigos que se corresponde con la intercalacin predeterminada de la
base de datos o columna. Los caracteres que no se encuentren en esta pgina de cdigos se perdern.
DEFAULT
Especifica que el valor predeterminado definido para la columna debe reemplazar al valor existente en esa columna. Esta operacin tambin puede utilizarse
para cambiar la columna a NULL si no tiene asignado ningn valor predeterminado y se ha definido para aceptar valores NULL.
{+= | -= | *= | /= | %= | &= | ^= | |= }
Operador de asignacin compuesta:
+= Sumar y asignar
-= Restar y asignar
*= Multiplicar y asignar
/= Dividir y asignar
%= Mdulo y asignar
&= AND bit a bit y asignar
^= XOR bit a bit y asignar
|= OR bit a bit y asignar
udt_column_name
Es una columna de un tipo definido por el usuario.
property_name | field_name
Es un miembro de propiedad pblico o un miembro de datos pblico de un tipo definido por el usuario.
method_name ( argument [ ,... n] )
Es un mtodo mutador pblico no esttico de udt_column_name que utiliza uno o varios argumentos.
.WRITE (expression,@Offset,@Length)
Especifica que una seccin del valor de column_name se va a modificar. expression reemplaza las unidades @Length a partir de @Offset 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 copia a 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 es NULL, la operacin de actualizacin quita todos los datos de @Offset hasta el final del valor de column_name.
Para obtener ms informacin, vea la seccin Notas.
@ variable
Es una variable declarada que se establece en el valor devuelto por expression.
SET @variable = column = expression establece la variable en el mismo valor que la columna. Esto no es lo mismo que SET @variable = column, column =
expression, que establece la variable en el valor previo a la actualizacin de la columna.
<OUTPUT_Clause>
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 TransactSQL.
FROM <table_source>
Especifica que se utiliza un origen de tabla, vista o tabla derivada para proporcionar los criterios de la operacin de actualizacin. Para obtener ms
informacin, vea FROM (Transact-SQL).
Si el objeto que se actualiza es el que se indica en la clusula FROM y solo hay una referencia al objeto en ella, puede especificarse o no un alias de objeto. Si el
objeto que se actualiza aparece ms de una vez en la clusula FROM, una nica referencia al objeto no debe especificar un alias de tabla. Todas las dems
referencias al objeto de la clusula FROM deben incluir un alias de objeto.
Una vista con un desencadenador INSTEAD OF UPDATE no puede ser el destino de UPDATE con una clusula FROM.
Nota
Las llamadas a OPENDATASOURCE, OPENQUERY u OPENROWSET en la clusula FROM se evalan por separado y de forma independiente de otras llamadas
a estas funciones utilizadas como destino de la actualizacin, incluso si se han suministrado argumentos idnticos a las dos llamadas. En particular, las
condiciones de filtro o combinacin aplicadas en el resultado de una de esas llamadas no tienen ningn efecto en los resultados de la otra llamada.
WHERE
Especifica las condiciones que limitan las filas que se actualizan. Hay dos modos de actualizacin, dependiendo del formato de clusula WHERE que se utilice:
Las actualizaciones por bsqueda especifican una condicin de bsqueda para calificar las filas que se van a eliminar.
Las actualizaciones posicionadas utilizan la clusula CURRENT OF para especificar un cursor. La operacin de actualizacin se produce en la posicin
actual del cursor.
<search_condition>
Especifica la condicin que debe cumplirse para que se actualicen las filas. La condicin de bsqueda tambin puede ser la condicin en la que se basa una
combinacin. El nmero de predicados que pueden incluirse en una condicin de bsqueda no tiene lmite. Para obtener ms informacin acerca de los
predicados y las condiciones de bsqueda, vea Condiciones de bsqueda TransactSQL.
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 Tabl e1 cumplen los requisitos de la
clusula FROM de la instruccin UPDATE, pero no se define qu fila de Tabl e1 se utiliza para actualizar la fila de Tabl e2.
USE Advent ur eWor ks2012;
GO
I F OBJ ECT_I D ( ' dbo. Tabl e1' , ' U' ) I S NOT NULL
DROP TABLE dbo. Tabl e1;
Puede ocurrir el mismo problema cuando se combinan las clusulas FROM y WHERE CURRENT OF. En el ejemplo siguiente, las dos filas de Tabl e2 cumplen los
requisitos de la clusula FROMde la instruccin UPDATE. No se ha definido qu fila de Tabl e2 se utilizar para actualizar la fila de Tabl e1.
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 imagecon 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.
GO
I F OBJ ECT_I D ( ' dbo. Tabl e2' , ' U' ) I S NOT NULL
DROP TABLE dbo. Tabl e2;
GO
CREATE TABLE dbo. Tabl e1
( Col A i nt NOT NULL, Col B deci mal ( 10, 3) NOT NULL) ;
GO
CREATE TABLE dbo. Tabl e2
( Col A i nt PRI MARY KEY NOT NULL, Col B deci mal ( 10, 3) NOT NULL) ;
GO
I NSERT I NTO dbo. Tabl e1 VALUES( 1, 10. 0) , ( 1, 20. 0) ;
I NSERT I NTO dbo. Tabl e2 VALUES( 1, 0. 0) ;
GO
UPDATE dbo. Tabl e2
SET dbo. Tabl e2. Col B =dbo. Tabl e2. Col B +dbo. Tabl e1. Col B
FROMdbo. Tabl e2
I NNER J OI N dbo. Tabl e1
ON ( dbo. Tabl e2. Col A =dbo. Tabl e1. Col A) ;
GO
SELECT Col A, Col B
FROMdbo. Tabl e2;
USE Advent ur eWor ks2012;
GO
I F OBJ ECT_I D ( ' dbo. Tabl e1' , ' U' ) I S NOT NULL
DROP TABLE dbo. Tabl e1;
GO
I F OBJ ECT_I D ( ' dbo. Tabl e2' , ' U' ) I S NOT NULL
DROP TABLE dbo. Tabl e2;
GO
CREATE TABLE dbo. Tabl e1
( c1 i nt PRI MARY KEY NOT NULL, c2 i nt NOT NULL) ;
GO
CREATE TABLE dbo. Tabl e2
( d1 i nt PRI MARY KEY NOT NULL, d2 i nt NOT NULL) ;
GO
I NSERT I NTO dbo. Tabl e1 VALUES ( 1, 10) ;
I NSERT I NTO dbo. Tabl e2 VALUES ( 1, 20) , ( 2, 30) ;
GO
DECLARE abc CURSOR LOCAL FOR
SELECT c1, c2
FROMdbo. Tabl e1;
OPEN abc;
FETCH abc;
UPDATE dbo. Tabl e1
SET c2 =c2 +d2
FROMdbo. Tabl e2
WHERE CURRENT OF abc;
GO
SELECT c1, c2 FROMdbo. Tabl e1;
GO
Importante
Los tipos de datos ntext, text e imagese quitarn en una versin futura de Microsoft SQL Server. Evite su uso en nuevos trabajos de desarrollo y piense en
modificar las aplicaciones que los usan actualmente. Use nvarchar(max), varchar(max) y varbinary(max) en su lugar.
Actualizar tipos de datos de valores grandes
Use la clusula .WRITE (expression, @Offset,@Length para realizar una actualizacin parcial o completa de los tipos de datos varchar(max), nvarchar(max) y
varbinary(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 se hace referencia en una clusula OUTPUT a la columna modificada por la clusula .WRITE, el valor completo de la columna, ya sea la imagen anterior 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 Poi nt , definido por el usuario, mediante la conversin
explcita de una cadena.
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 Poi nt denominado Set XY. Esto actualiza el estado de la instancia del tipo.
Nota
SQL Server devuelve un error si se invoca un mtodo mutador en un valor NULL de TransactSQL, o si un nuevo valor producido por un mtodo mutador es
NULL.
Modificar el valor de un miembro de propiedad registrado o un miembro de datos pblico del tipo definido por el usuario. La expresin que suministra el valor
debe poder convertirse implcitamente al tipo de la propiedad. En el ejemplo siguiente se modifica el valor de la propiedad X del tipo Poi nt definido por el
usuario.
Para modificar diferentes propiedades de la misma columna de tipo definido por el usuario, emita varias instrucciones UPDATE o invoque un mtodo mutador
del tipo.
Actualizar datos FILESTREAM
Puede utilizar la instruccin UPDATE para actualizar un campo FILESTREAM de forma que tenga un valor nulo, un valor vaco o una cantidad relativamente pequea de
datos insertados. Sin embargo, se enva una gran cantidad de datos de manera ms eficaz en un archivo si se utilizan interfaces de Win32. Al actualizar un campo
FILESTREAM, modifica los datos BLOB subyacentes en el sistema de archivos. Cuando un campo FILESTREAM est establecido en NULL, se eliminan los datos BLOB
asociados al campo. No puede utilizar .WRITE() para realizar actualizaciones parciales de datos FILESTREAM. Para obtener ms informacin, vea FILESTREAM (SQL
Server).
UPDATE Ci t i es
SET Locat i on =CONVERT( Poi nt , ' 12. 3: 46. 2' )
WHERE Name =' Anchor age' ;
UPDATE Ci t i es
SET Locat i on. Set XY( 23. 5, 23. 5)
WHERE Name =' Anchor age' ;
UPDATE Ci t i es
SET Locat i on. X =23. 5
WHERE Name =' Anchor age' ;
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.
El conjunto de resultados es el siguiente.
I D Val ue
- - - - - - - - - - -
1 100
2 200
( 2 r ow( s) af f ect ed)
USE t empdb;
GO
- - UPDATE st at ement wi t h CTE r ef er ences t hat ar e cor r ect l y mat ched.
DECLARE @x TABLE ( I D i nt , Val ue i nt ) ;
DECLARE @y TABLE ( I D i nt , Val ue i nt ) ;
I NSERT @x VALUES ( 1, 10) , ( 2, 20) ;
I NSERT @y VALUES ( 1, 100) , ( 2, 200) ;
WI TH ct e AS ( SELECT * FROM@x)
UPDATE x - - ct e i s r ef er enced by t he al i as.
SET Val ue =y. Val ue
FROMct e AS x - - ct e i s assi gned an al i as.
I NNER J OI N @y AS y ON y. I D =x. I D;
SELECT * FROM@x;
GO
- - UPDATE st at ement wi t h CTE r ef er ences t hat ar e i ncor r ect l y mat ched.
USE t empdb;
GO
DECLARE @x TABLE ( I D i nt , Val ue i nt ) ;
DECLARE @y TABLE ( I D i nt , Val ue i nt ) ;
I NSERT @x VALUES ( 1, 10) , ( 2, 20) ;
I NSERT @y VALUES ( 1, 100) , ( 2, 200) ;
WI TH ct e AS ( SELECT * FROM@x)
UPDATE ct e - - ct e i s not r ef er enced by t he al i as.
SET Val ue =y. Val ue
FROMct e AS x - - ct e i s assi gned an al i as.
I NNER J OI N @y AS y ON y. I D =x. I D;
SELECT * FROM@x;
GO
El conjunto de resultados es el siguiente.
I D Val ue
- - - - - - - - - - -
1 100
2 100
( 2 r ow( s) af f ect ed)
Comportamiento del bloqueo
Una instruccin UPDATE siempre adquiere un bloqueo exclusivo X en la tabla que modifica y retiene ese bloqueo hasta que se completa la transaccin. Con un
bloqueo exclusivo, ninguna otra transaccin puede modificar los datos. Puede especificar sugerencias de tabla para invalidar este comportamiento predeterminado
durante la ejecucin de la instruccin UPDATE especificando otro mtodo de bloqueo, sin embargo se recomienda que solo los desarrolladores y administradores de
bases de datos experimentados usen las sugerencias y nicamente como ltimo recurso. Para obtener ms informacin, vea Sugerencias de tabla (Transact-SQL).
Comportamiento del registro
La instruccin UPDATE se registra; sin embargo, las actualizaciones parciales de tipos de datos de valores grandes mediante la clusula .WRITE se registran
mnimamente. Para obtener ms informacin, vea "Actualizar tipos de datos de valores grandes" en la seccin anterior "Tipos de datos".
Seguridad
Permisos
Se requieren permisos UPDATE en la tabla de destino. Tambin se requieren permisos SELECT para la tabla que se actualiza si la instruccin UPDATE contiene una
clusula WHERE o en el caso de que el argumento expression de la clusula SET utilice una columna de la tabla.
Los permisos para utilizar UPDATE corresponden de forma predeterminada a los miembros del rol fijo de servidor sysadmin, de los roles fijos de base de datos
db_owner y db_datawriter y al propietario de la tabla. Los miembros de los roles sysadmin, db_owner y db_securityadmin, y el propietario de la tabla pueden
transferir permisos a otros usuarios.
Ejemplos
Categora Elementos de sintaxis ofrecidos
Sintaxis bsica UPDATE
Limitar las filas que se actualizan WHERE TOP expresin de tabla comn WITH WHERE CURRENT OF
Establecer valores de columna valores calculados operadores compuestos valores predeterminados
subconsultas
Especificar objetos de destino que no sean tablas estndar vistas variables de tabla alias de tabla
Actualizar los datos basados en datos del resto de las tablas FROM
Actualizar las filas de una tabla remota servidor vinculado OPENQUERY OPENDATASOURCE
Actualizar tipos de datos de objetos grandes .WRITE OPENROWSET
Actualizar tipos definidos por el usuario tipos definidos por el usuario
Invalidar el comportamiento predeterminado del optimizador de consultas mediante
sugerencias
sugerencias de tabla sugerencias de consulta
Capturar los resultados de la instruccin UPDATE Clusula OUTPUT
Usar UPDATE en otras instrucciones Procedimientos almacenados TRYCATCH
Sintaxis bsica
Los ejemplos de esta seccin demuestran la funcionalidad bsica de la instruccin UPDATE con la sintaxis mnima requerida.
A.Usar una instruccin UPDATE simple
En el ejemplo siguiente se actualiza un solo valor de columna para todas las filas de la tabla Per son. Addr ess.
B.Actualizar varias columnas
En el siguiente ejemplo se actualizan los valores de las columnas Bonus, Commi ssi onPct y Sal esQuot a para todas las filas de la tabla Sal esPer son.
Limitar las filas que se actualizan
En los ejemplos de esta seccin se muestran varias formas de limitar el nmero de filas afectadas por la instruccin UPDATE.
A.Usar la clusula WHERE
En el ejemplo siguiente se utiliza la clusula WHERE para especificar las filas que se van a actualizar. La instruccin actualiza el valor de la columna Col or de la tabla
Pr oduct i on. Pr oduct para todas las filas con un valor existente de 'Red' en la columna Col or y con un valor que comience por 'Road-250' en la columna Name.
B.Usar la clusula TOP
En los siguientes ejemplos use la clusula TOP para limitar el nmero de filas que se modifican en una instruccin UPDATE. Cuando se usa una clusula TOP n) con
UPDATE, la operacin de actualizacin se realiza en una seleccin aleatoria de un nmero de filas 'n'. En el ejemplo siguiente se actualiza un 25 por ciento la columna
Vacat i onHour s en 10 filas aleatorias de la tabla Empl oyee.
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.
C.Usar la clusula WITH common_table_expression
En el siguiente ejemplo se actualiza el valor Per Assemnbl yQt y para todas las partes y componentes que se utilizan directamente o indirectamente para crear el
Pr oduct Assembl yI D 800. La expresin de tabla comn devuelve una lista jerrquica de partes que se utilizan directamente para generar el Pr oduct Assembl yI D 800 y
las partes que se utilizan para generar esos componentes, etc. Solo se modifican las filas devueltas por la expresin de tabla comn.
USE Advent ur eWor ks2012;
GO
UPDATE Per son. Addr ess
SET Modi f i edDat e =GETDATE( ) ;
USE Advent ur eWor ks2012;
GO
UPDATE Sal es. Sal esPer son
SET Bonus =6000, Commi ssi onPct =. 10, Sal esQuot a =NULL;
GO
USE Advent ur eWor ks2012;
GO
UPDATE Pr oduct i on. Pr oduct
SET Col or =N' Met al l i c Red'
WHERE Name LI KE N' Road- 250%' AND Col or =N' Red' ;
GO
USE Advent ur eWor ks2012;
GO
UPDATE Pr oduct i on. Pr oduct
SET Col or =N' Met al l i c Red'
WHERE Name LI KE N' Road- 250%' AND Col or =N' Red' ;
GO
UPDATE HumanResour ces. Empl oyee
SET Vacat i onHour s =Vacat i onHour s +8
FROM( SELECT TOP 10 Busi nessEnt i t yI D FROMHumanResour ces. Empl oyee
ORDER BY Hi r eDat e ASC) AS t h
WHERE HumanResour ces. Empl oyee. Busi nessEnt i t yI D =t h. Busi nessEnt i t yI D;
GO
USE Advent ur eWor ks2012;
GO
WI TH Par t s( Assembl yI D, Component I D, Per Assembl yQt y, EndDat e, Component Level ) AS
(
SELECT b. Pr oduct Assembl yI D, b. Component I D, b. Per Assembl yQt y,
b. EndDat e, 0 AS Component Level
FROMPr oduct i on. Bi l l Of Mat er i al s AS b
WHERE b. Pr oduct Assembl yI D =800
AND b. EndDat e I S NULL
UNI ON ALL
SELECT bom. Pr oduct Assembl yI D, bom. Component I D, p. Per Assembl yQt y,
bom. EndDat e, Component Level +1
FROMPr oduct i on. Bi l l Of Mat er i al s AS bom
I NNER J OI N Par t s AS p
ON bom. Pr oduct Assembl yI D =p. Component I D
AND bom. EndDat e I S NULL
)
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 t abl e_name especificado en la instruccin UPDATE. Las dems tablas que participan en el cursor no se ven afectadas.
Establecer valores de columna
En los ejemplos de esta seccin se muestra la actualizacin de columnas mediante valores calculados, subconsultas y valores DEFAULT.
A.Especificar un valor calculado
En los siguientes ejemplos se usan valores calculados en una instruccin UPDATE. En el ejemplo se duplica el valor de la columna Li st Pr i ce para todas las filas de la
tabla Pr oduct .
B.Especificar un operador compuesto
En el ejemplo siguiente se usa la variable @NewPr i ce para incrementar el precio de todas las bicicletas rojas, tomando como base el precio actual y sumndole 10.
En el siguiente ejemplo se usa el operador compuesto += para anexar los datos ' - t ool mal f unct i on' al valor existente de la columna Name de las filas que tienen
un valor de Scr apReasonI Dcomprendido entre 10 y 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 Sal esYTDde la tabla Sal esPer son para reflejar las ventas ms recientes registradas en la
tabla Sal esOr der Header . La subconsulta suma las ventas de cada vendedor en la instruccin UPDATE.
UPDATE Pr oduct i on. Bi l l Of Mat er i al s
SET Per Assembl yQt y =c. Per Assembl yQt y * 2
FROMPr oduct i on. Bi l l Of Mat er i al s AS c
J OI N Par t s AS d ON c. Pr oduct Assembl yI D =d. Assembl yI D
WHERE d. Component Level =0;
USE Advent ur eWor ks2012;
GO
DECLARE compl ex_cur sor CURSOR FOR
SELECT a. Busi nessEnt i t yI D
FROMHumanResour ces. Empl oyeePayHi st or y AS a
WHERE Rat eChangeDat e <>
( SELECT MAX( Rat eChangeDat e)
FROMHumanResour ces. Empl oyeePayHi st or y AS b
WHERE a. Busi nessEnt i t yI D =b. Busi nessEnt i t yI D) ;
OPEN compl ex_cur sor ;
FETCH FROMcompl ex_cur sor ;
UPDATE HumanResour ces. Empl oyeePayHi st or y
SET PayFr equency =2
WHERE CURRENT OF compl ex_cur sor ;
CLOSE compl ex_cur sor ;
DEALLOCATE compl ex_cur sor ;
GO
USE Advent ur eWor ks2012 ;
GO
UPDATE Pr oduct i on. Pr oduct
SET Li st Pr i ce =Li st Pr i ce * 2;
GO
USE Advent ur eWor ks2012;
GO
DECLARE @NewPr i ce i nt =10;
UPDATE Pr oduct i on. Pr oduct
SET Li st Pr i ce +=@NewPr i ce
WHERE Col or =N' Red' ;
GO
USE Advent ur eWor ks2012;
GO
UPDATE Pr oduct i on. Scr apReason
SET Name +=' - t ool mal f unct i on'
WHERE Scr apReasonI D BETWEEN 10 and 12;
USE Advent ur eWor ks2012;
GO
UPDATE Sal es. Sal esPer son
SET Sal esYTD =Sal esYTD +
( SELECT SUM( so. SubTot al )
FROMSal es. Sal esOr der Header AS so
D.Actualizar las filas con valores DEFAULT
En el siguiente ejemplo se establece la columna Cost Rat e en su valor predeterminado (0.00) para todas las filas que tengan un valor de Cost Rat e mayor que 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.
B.Especificar un alias de tabla como el objeto de destino
En el siguiente ejemplo se actualizan las filas de la tabla Pr oduct i on. Scr apReason. El alias de tabla asignado a Scr apReason de la clusula FROM se especifica como el
objeto de destino de la clusula UPDATE.
C.Especificar una variable de tabla como el objeto de destino
En el siguiente ejemplo se actualizan las filas de una variable de tabla.
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
WHERE so. Or der Dat e =( SELECT MAX( Or der Dat e)
FROMSal es. Sal esOr der Header AS so2
WHERE so2. Sal esPer sonI D =so. Sal esPer sonI D)
AND Sal es. Sal esPer son. Busi nessEnt i t yI D =so. Sal esPer sonI D
GROUP BY so. Sal esPer sonI D) ;
GO
USE Advent ur eWor ks2012;
GO
UPDATE Pr oduct i on. Locat i on
SET Cost Rat e =DEFAULT
WHERE Cost Rat e >20. 00;
USE Advent ur eWor ks2012;
GO
UPDATE Per son. vSt at ePr ovi nceCount r yRegi on
SET Count r yRegi onName =' Uni t ed St at es of Amer i ca'
WHERE Count r yRegi onName =' Uni t ed St at es' ;
USE Advent ur eWor ks2012;
GO
UPDATE sr
SET sr . Name +=' - t ool mal f unct i on'
FROMPr oduct i on. Scr apReason AS sr
J OI N Pr oduct i on. Wor kOr der AS wo
ON sr . Scr apReasonI D =wo. Scr apReasonI D
AND wo. Scr appedQt y >300;
USE Advent ur eWor ks2012;
GO
- - Cr eat e t he t abl e var i abl e.
DECLARE @MyTabl eVar t abl e(
EmpI D i nt NOT NULL,
NewVacat i onHour s i nt ,
Modi f i edDat e dat et i me) ;
- - Popul at e t he t abl e var i abl e wi t h empl oyee I D val ues f r omHumanResour ces. Empl oyee.
I NSERT I NTO @MyTabl eVar ( EmpI D)
SELECT Busi nessEnt i t yI D FROMHumanResour ces. Empl oyee;
- - Updat e col umns i n t he t abl e var i abl e.
UPDATE @MyTabl eVar
SET NewVacat i onHour s =e. Vacat i onHour s +20,
Modi f i edDat e =GETDATE( )
FROMHumanResour ces. Empl oyee AS e
WHERE e. Busi nessEnt i t yI D =EmpI D;
- - Di spl ay t he r esul t s of t he UPDATE st at ement .
SELECT EmpI D, NewVacat i onHour s, Modi f i edDat e FROM@MyTabl eVar
ORDER BY EmpI D;
GO
En este ejemplo se modifica la columna Sal esYTDde la tabla Sal esPer son para reflejar las ventas ms recientes registradas en la tabla Sal esOr der Header .
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 Sal esYTD 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:
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 mediante
sp_addlinkedserver. El nombre del servidor vinculado, MyLi nkSer ver , 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 @dat asr c.
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.
C.Actualizar datos en una tabla remota con la funcin OPENDATASOURCE
En el ejemplo siguiente se inserta una fila en una tabla remota especificando la funcin de conjunto de filas OPENDATASOURCE. Especifique un nombre de servidor
vlido para el origen de datos con el formato server_name o server_name\instance_name. Quiz deba configurar la instancia de SQL Server para las consultas
distribuidas ad hoc. Para obtener ms informacin, vea ad hoc distributed queries opcin de configuracin del servidor.
USE Advent ur eWor ks2012;
GO
UPDATE Sal es. Sal esPer son
SET Sal esYTD =Sal esYTD +SubTot al
FROMSal es. Sal esPer son AS sp
J OI N Sal es. Sal esOr der Header AS so
ON sp. Busi nessEnt i t yI D =so. Sal esPer sonI D
AND so. Or der Dat e =( SELECT MAX( Or der Dat e)
FROMSal es. Sal esOr der Header
WHERE Sal esPer sonI D =sp. Busi nessEnt i t yI D) ;
GO
USE Advent ur eWor ks2012;
GO
UPDATE Sal es. Sal esPer son
SET Sal esYTD =Sal esYTD +
( SELECT SUM( so. SubTot al )
FROMSal es. Sal esOr der Header AS so
WHERE so. Or der Dat e =( SELECT MAX( Or der Dat e)
FROMSal es. Sal esOr der Header AS so2
WHERE so2. Sal esPer sonI D =so. Sal esPer sonI D)
AND Sal es. Sal esPer son. Busi nessEnt i t yI D =so. Sal esPer sonI D
GROUP BY so. Sal esPer sonI D) ;
GO
USE mast er ;
GO
- - Cr eat e a l i nk t o t he r emot e dat a sour ce.
- - Speci f y a val i d ser ver name f or @dat asr c as ' ser ver _name' or ' ser ver _name\ i nst ance_name' .
EXEC sp_addl i nkedser ver @ser ver =N' MyLi nkSer ver ' ,
@sr vpr oduct =N' ' ,
@pr ovi der =N' SQLNCLI 10' ,
@dat asr c =N' <ser ver name>' ,
@cat al og =N' Advent ur eWor ks2012' ;
GO
USE Advent ur eWor ks2012;
GO
- - Speci f y t he r emot e dat a sour ce usi ng a f our - par t name
- - i n t he f or ml i nked_ser ver . cat al og. schema. obj ect .
UPDATE MyLi nkSer ver . Advent ur eWor ks2012. HumanResour ces. Depar t ment
SET Gr oupName =N' Publ i c Rel at i ons'
WHERE Depar t ment I D =4;
UPDATE OPENQUERY ( MyLi nkSer ver , ' SELECT Gr oupName FROMHumanResour ces. Depar t ment WHERE Depar t ment I D =4' )
SET Gr oupName =' Sal es and Mar ket i ng' ;
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 Document Summar y, una columna de tipo nvarchar(max) de la tabla
Pr oduct i on. Document . La palabra component s se sustituye por la palabra f eat ur es 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 Document Summar y a la variable de tabla @MyTabl eVar .
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.
UPDATE OPENQUERY ( MyLi nkSer ver , ' SELECT Gr oupName FROMHumanResour ces. Depar t ment WHERE Depar t ment I D =4' )
SET Gr oupName =' Sal es and Mar ket i ng' ;
USE Advent ur eWor ks2012;
GO
DECLARE @MyTabl eVar t abl e (
Summar yBef or e nvar char ( max) ,
Summar yAf t er nvar char ( max) ) ;
UPDATE Pr oduct i on. Document
SET Document Summar y . WRI TE ( N' f eat ur es' , 28, 10)
OUTPUT del et ed. Document Summar y,
i nser t ed. Document Summar y
I NTO @MyTabl eVar
WHERE Ti t l e =N' Fr ont Ref l ect or Br acket I nst al l at i on' ;
SELECT Summar yBef or e, Summar yAf t er
FROM@MyTabl eVar ;
GO
USE Advent ur eWor ks2012;
GO
- - Repl aci ng NULL val ue wi t h t empor ar y dat a.
UPDATE Pr oduct i on. Document
SET Document Summar y =N' Repl aci ng NULL val ue'
WHERE Ti t l e =N' Cr ank Ar mand Ti r e Mai nt enance' ;
GO
SELECT Document Summar y
FROMPr oduct i on. Document
WHERE Ti t l e =N' Cr ank Ar mand Ti r e Mai nt enance' ;
GO
- - Repl aci ng t empor ar y dat a wi t h t he cor r ect dat a. Set t i ng @Lengt h t o NULL
- - t r uncat es al l exi st i ng dat a f r omt he @Of f set posi t i on.
UPDATE Pr oduct i on. Document
SET Document Summar y . WRI TE( N' Car ef ul l y i nspect and mai nt ai n t he t i r es and cr ank ar ms. ' , 0, NULL)
WHERE Ti t l e =N' Cr ank Ar mand Ti r e Mai nt enance' ;
GO
SELECT Document Summar y
FROMPr oduct i on. Document
WHERE Ti t l e =N' Cr ank Ar mand Ti r e Mai nt enance' ;
GO
- - Appendi ng addi t i onal dat a t o t he end of t he col umn by set t i ng
- - @Of f set t o NULL.
UPDATE Pr oduct i on. Document
SET Document Summar y . WRI TE ( N' Appendi ng dat a t o t he end of t he col umn. ' , NULL, 0)
WHERE Ti t l e =N' Cr ank Ar mand Ti r e Mai nt enance' ;
GO
SELECT Document Summar y
FROMPr oduct i on. Document
WHERE Ti t l e =N' Cr ank Ar mand Ti r e Mai nt enance' ;
GO
- - Removi ng al l dat a f r om@Of f set t o t he end of t he exi st i ng val ue by
- - set t i ng expr essi on t o NULL.
UPDATE Pr oduct i on. Document
SET Document Summar y . WRI TE ( NULL, 56, 0)
WHERE Ti t l e =N' Cr ank Ar mand Ti r e Mai nt enance' ;
GO
SELECT Document Summar y
FROMPr oduct i on. Document
WHERE Ti t l e =N' Cr ank Ar mand Ti r e Mai nt enance' ;
GO
- - Removi ng par t i al dat a begi nni ng at posi t i on 9 and endi ng at
- - posi t i on 21.
UPDATE Pr oduct i on. Document
SET Document Summar y . WRI TE ( ' ' , 9, 12)
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 Ti r es. j pg en la ruta de acceso especificada.
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 Xr ay 1. Para obtener ms informacin, vea FILESTREAM (SQL Server).
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 actualizar un UDT suministrando un valor en un tipo de datos del sistema de SQL Server, siempre que el tipo definido por el usuario admita la conversin
implcita o explcita desde ese tipo. En el ejemplo siguiente se muestra cmo actualizar un valor de una columna de tipo Poi nt , definido por el usuario, mediante la
conversin explcita de una cadena.
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 Poi nt denominado Set XY. Esto actualiza el estado de la instancia del tipo.
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
Poi nt definido por el usuario.
Invalidar el comportamiento predeterminado del optimizador de consultas mediante sugerencias
En los ejemplos de esta seccin se muestra cmo usar sugerencias de tabla y de consulta para invalidar de forma temporal el comportamiento predeterminado del
optimizador de consultas cuando se procesa la instruccin UPDATE.
Advertencia
Como el optimizador de consultas de SQL Server suele seleccionar el mejor plan de ejecucin de una consulta, se recomienda que nicamente los administradores
de bases de datos y los desarrolladores experimentados utilicen las sugerencias y como ltimo recurso.
A.Especificar una sugerencia de tabla
En el siguiente ejemplo se especifica la sugerencia de tabla TABLOCK. Esta sugerencia especifica que se aplique un bloqueo compartido a la tabla Pr oduct i on. Pr oduct
WHERE Ti t l e =N' Cr ank Ar mand Ti r e Mai nt enance' ;
GO
SELECT Document Summar y
FROMPr oduct i on. Document
WHERE Ti t l e =N' Cr ank Ar mand Ti r e Mai nt enance' ;
GO
USE Advent ur eWor ks2012;
GO
UPDATE Pr oduct i on. Pr oduct Phot o
SET ThumbNai l Phot o =(
SELECT *
FROMOPENROWSET( BULK ' c: \ Ti r es. j pg' , SI NGLE_BLOB) AS x )
WHERE Pr oduct Phot oI D =1;
GO
UPDATE Ar chi ve. dbo. Recor ds
SET [ Char t ] =CAST( ' Xr ay 1' as var bi nar y( max) )
WHERE [ Ser i al Number ] =2;
UPDATE dbo. Ci t i es
SET Locat i on =CONVERT( Poi nt , ' 12. 3: 46. 2' )
WHERE Name =' Anchor age' ;
UPDATE dbo. Ci t i es
SET Locat i on. Set XY( 23. 5, 23. 5)
WHERE Name =' Anchor age' ;
UPDATE dbo. Ci t i es
SET Locat i on. X =23. 5
WHERE Name =' Anchor age' ;
y que se mantenga hasta que finalice la instruccin UPDATE.
B.Especificar una sugerencia de consulta
En el siguiente ejemplo se especifica la sugerencia de consultaOPTI MI ZE FOR ( @var i abl e) 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.
Capturar los resultados de la instruccin UPDATE
Los ejemplos de esta seccin demuestran cmo usar la clusula OUTPUT para devolver informacin de cada fila afectada por una instruccin UPDATE o de expresiones
que se basan en esta instruccin. Estos resultados se pueden devolver a la aplicacin de procesamiento para que los utilice en mensajes de confirmacin, archivado y
otros requisitos similares de una aplicacin.
A.Usar UPDATE con la clusula OUTPUT
En el siguiente ejemplo se actualiza en un 25 por ciento la columna Vacat i onHour s de las 10 primeras filas de la tabla Empl oyee y tambin se establece el valor de la
columna Modi f i edDat e en la fecha actual. La clusula OUTPUT devuelve el valor de Vacat i onHour s antes de aplicar la instruccin UPDATE en la columna
del et ed. Vacat i onHour s y el valor actualizado en la columna i nser t ed. Vacat i onHour s en la variable de tabla @MyTabl eVar .
Las dos instrucciones SELECT que le siguen devuelven los valores en @MyTabl eVar y los resultados de la operacin de actualizacin en la tabla Empl oyee. Para obtener
ms ejemplos en los que se utiliza la clusula OUTPUT, vea OUTPUT clusula de TransactSQL.
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 @NewHour s y un parmetro
de salida @RowCount . El valor del parmetro @NewHour s se utiliza en la instruccin UPDATE para actualizar la columna Vacat i onHour s de la tabla
HumanResour ces. Empl oyee. 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 Vacat i onHour s condicionalmente. Cuando se paga al empleado por hora (Sal ar i edFl ag = 0),
Vacat i onHour s se establece en el nmero actual de horas ms el valor especificado en @NewHour s; de lo contrario, Vacat i onHour s se establece en el valor
especificado en @NewHour s.
USE Advent ur eWor ks2012;
GO
UPDATE Pr oduct i on. Pr oduct
WI TH ( TABLOCK)
SET Li st Pr i ce =Li st Pr i ce * 1. 10
WHERE Pr oduct Number LI KE ' BK- %' ;
GO
USE Advent ur eWor ks2012;
GO
CREATE PROCEDURE Pr oduct i on. uspPr oduct Updat e
@Pr oduct nvar char ( 25)
AS
SET NOCOUNT ON;
UPDATE Pr oduct i on. Pr oduct
SET Li st Pr i ce =Li st Pr i ce * 1. 10
WHERE Pr oduct Number LI KE @Pr oduct
OPTI ON ( OPTI MI ZE FOR ( @Pr oduct =' BK- %' ) ) ;
GO
- - Execut e t he st or ed pr ocedur e
EXEC Pr oduct i on. uspPr oduct Updat e ' BK- %' ;
USE Advent ur eWor ks2012;
GO
DECLARE @MyTabl eVar t abl e(
EmpI D i nt NOT NULL,
Ol dVacat i onHour s i nt ,
NewVacat i onHour s i nt ,
Modi f i edDat e dat et i me) ;
UPDATE TOP ( 10) HumanResour ces. Empl oyee
SET Vacat i onHour s =Vacat i onHour s * 1. 25,
Modi f i edDat e =GETDATE( )
OUTPUT i nser t ed. Busi nessEnt i t yI D,
del et ed. Vacat i onHour s,
i nser t ed. Vacat i onHour s,
i nser t ed. Modi f i edDat e
I NTO @MyTabl eVar ;
- - Di spl ay t he r esul t set of t he t abl e var i abl e.
SELECT EmpI D, Ol dVacat i onHour s, NewVacat i onHour s, Modi f i edDat e
FROM@MyTabl eVar ;
GO
- - Di spl ay t he r esul t set of t he t abl e.
SELECT TOP ( 10) Busi nessEnt i t yI D, Vacat i onHour s, Modi f i edDat e
FROMHumanResour ces. Empl oyee;
GO
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.
Vea tambin
Referencia
CREATE TABLE (SQL Server)
CREATE TRIGGER (Transact-SQL)
Cursores (Transact-SQL)
DELETE (Transact-SQL)
INSERT (Transact-SQL)
Funciones de texto e imagen (Transact-SQL)
WITH common_table_expression (Transact-SQL)
Conceptos
FILESTREAM (SQL Server)
2014 Microsoft
USE Advent ur eWor ks2012;
GO
CREATE PROCEDURE HumanResour ces. Updat e_Vacat i onHour s
@NewHour s smal l i nt
AS
SET NOCOUNT ON;
UPDATE HumanResour ces. Empl oyee
SET Vacat i onHour s =
( CASE
WHEN Sal ar i edFl ag =0 THEN Vacat i onHour s +@NewHour s
ELSE @NewHour s
END
)
WHERE Cur r ent Fl ag =1;
GO
EXEC HumanResour ces. Updat e_Vacat i onHour s 40;
USE Advent ur eWor ks2012;
GO
BEGI N TRANSACTI ON;
BEGI N TRY
- - I nt ent i onal l y gener at e a const r ai nt vi ol at i on er r or .
UPDATE HumanResour ces. Depar t ment
SET Name =N' MyNewName'
WHERE Depar t ment I D BETWEEN 1 AND 2;
END TRY
BEGI N CATCH
SELECT
ERROR_NUMBER( ) AS Er r or Number
, ERROR_SEVERI TY( ) AS Er r or Sever i t y
, ERROR_STATE( ) AS Er r or St at e
, ERROR_PROCEDURE( ) AS Er r or Pr ocedur e
, ERROR_LI NE( ) AS Er r or Li ne
, ERROR_MESSAGE( ) AS Er r or Message;
I F @@TRANCOUNT >0
ROLLBACK TRANSACTI ON;
END CATCH;
I F @@TRANCOUNT >0
COMMI T TRANSACTI ON;
GO
UPDATETEXT (Transact-SQL)
Actualiza un campo text, ntext o image existente. Utilice UPDATETEXT solo para cambiar una parte de una columna text, ntext o image existente. Utilice WRITETEXT para
actualizar y reemplazar un campo text, ntext o image completo.
Importante
Esta caracterstica se quitar en una versin futura de Microsoft SQL Server. Evite utilizar esta caracterstica en nuevos trabajos de desarrollo y tenga previsto modificar
las aplicaciones que actualmente la utilizan. Utilice los tipos de datos de valores grandes y la clusula .WRITE de la instruccin UPDATE, en su lugar.
Se aplica a: SQL Server SQL Server 2008 a travs de la versin actual).
Convenciones de sintaxis de Transact-SQL
Sintaxis
Argumentos
BULK
Hace posible que las herramientas de carga carguen flujos de datos binarios. La herramienta debe proporcionar flujos en el nivel de protocolo TDS. Cuando el
flujo de datos no est presente el procesador de consultas omite la opcin BULK.
Importante
Recomendamos que la opcin BULK no se utilice en las aplicaciones basadas en SQL Server. Es posible que esta opcin se modifique o quite en versiones
futuras de SQL Server.
table_name . dest_column_name
Es el nombre de la tabla y la columna text, ntext o imageque se actualizarn. Los nombres de las tablas y de las columnas se deben ajustar a las reglas para
los identificadores. La especificacin de los nombres de la base de datos y del propietario es opcional.
dest_text_ptr
Es el valor de un puntero de texto devuelto por la funcin TEXTPTR que seala a los datos text, ntext o image que se deben actualizar. dest_text_ptr debe ser
binary(16).
insert_offset
Es la posicin de inicio de la actualizacin a partir de cero. En columnas text o image, insert_offset es el nmero de bytes que se debe omitir desde el principio
de la columna existente antes de insertar nuevos datos. En columnas ntext, insert_offsetes el nmero de caracteres cada carcter ntext usa 2 bytes). Los datos
text, ntext o imageexistentes que empiecen en esta posicin de inicio a partir de cero se desplazan a la derecha para dejar espacio a los nuevos datos. Un
valor 0 inserta los nuevos datos al principio de los datos existentes. Un valor NULL anexa los nuevos datos al valor de datos existente.
delete_length
Es la longitud de los datos que se van a eliminar de la columna text, ntext o imageexistente, a partir de la posicin de insert_offset. El valor delete_lengthse
especifica en bytes para columnas text e image, y en caracteres para columnas ntext. Cada carcter ntext utiliza 2 bytes. Con un valor 0 no se eliminan datos.
Con un valor NULL, se eliminan todos los datos desde la posicin de insert_offset hasta el final de la columna text o image existente.
WITH LOG
El registro est determinado por el modelo de recuperacin vigente para la base de datos.
inserted_data
Son los datos que se van a insertar en la columna text, ntext o imageexistente en la ubicacin de insert_offset. Es un nico valor de tipo char, nchar, varchar,
nvarchar, binary, varbinary, text, ntext o image. inserted_data puede ser un literal o una variable.
table_name.src_column_name
Es el nombre de la tabla y de la columna text, ntext o image que se utiliza como origen de los datos insertados. Los nombres de las tablas y de las columnas
se deben ajustar a las reglas para los identificadores.
src_text_ptr
Es un valor de puntero de texto devuelto por la funcin TEXTPTR que seala a una columna text, ntext o image utilizada como origen de los datos insertados.
Nota
El valor de scr_text_ptrno debe ser igual que el valor de dest_text_ptr.
Comentarios
SQL Server 2014
UPDATETEXT [ BULK] { t abl e_name. dest _col umn_name dest _t ext _pt r }
{ NULL | i nser t _of f set }
{ NULL | del et e_l engt h }
[ WI TH LOG ]
[ i nser t ed_dat a
| { t abl e_name. sr c_col umn_name sr c_t ext _pt r } ]
Los datos recin insertados pueden ser una nica constante inserted_data, un nombre de tabla, un nombre de columna o un puntero de texto.
Accin de actualizacin Parmetros de UPDATETEXT
Para sustituir los datos
existentes
Especifique un valor de insert_offset que no sea NULL, un valor de delete_length que no sea cero y los nuevos datos que se deban
insertar.
Para eliminar datos existentes Especifique un valor insert_offset que no sea NULL y un valor de delete_length distinto de cero. No especifique nuevos datos para la
insercin.
Para insertar nuevos datos Especifique el valor de insert_offset, un valor 0 en delete_length y los nuevos datos que se deban insertar.
Para aumentar el rendimiento, se recomienda insertar o actualizar datos de tipo text, ntext e imageen tamaos de fragmentos que sean mltiplos de 8.040 bytes.
En SQL Server, es posible que existan punteros de texto consecutivos para datos de tipo text, ntext o imagepero que no sean vlidos. Para obtener informacin
acerca de la opcin text in row, vea sp_tableoption (Transact-SQL). Para obtener ms informacin sobre cmo invalidar punteros de texto, vea sp_invalidate_textptr
(Transact-SQL).
Para inicializar columnas text en NULL, use WRITETEXT; UPDATETEXT inicializa columnas text en una cadena vaca.
Permisos
Requiere el permiso UPDATE en la base de datos especificada.
Ejemplos
En el ejemplo siguiente se coloca el puntero de texto en la variable local @pt r val ; a continuacin, se utiliza UPDATETEXT para actualizar un error de ortografa.
Nota
Para ejecutar este ejemplo, debe instalar la base de datos pubs.
Vea tambin
Referencia
READTEXT (Transact-SQL)
TEXTPTR (Transact-SQL)
WRITETEXT (Transact-SQL)
2014 Microsoft
USE pubs;
GO
ALTER DATABASE pubs SET RECOVERY SI MPLE;
GO
DECLARE @pt r val bi nar y( 16) ;
SELECT @pt r val =TEXTPTR( pr _i nf o)
FROMpub_i nf o pr , publ i sher s p
WHERE p. pub_i d =pr . pub_i d
AND p. pub_name =' New Moon Books'
UPDATETEXT pub_i nf o. pr _i nf o @pt r val 88 1 ' b' ;
GO
ALTER DATABASE pubs SET RECOVERY FULL;
GO
WHERE (Transact-SQL)
Especifica la condicin de bsqueda de las filas devueltas por la consulta.
Se aplica a: SQL Server (SQL Server 2008 a versin actual, Windows Azure SQL Database Versin inicial a versin actual).
Convenciones de sintaxis de Transact-SQL
Sintaxis
Argumentos
< search_condition >
Define la condicin que se debe cumplir para que se devuelvan las filas. No hay lmite en cuanto al nmero de predicados que se puede incluir en una condicin
de bsqueda. Para obtener ms informacin acerca de los predicados y las condiciones de bsqueda, vea Condiciones de bsqueda TransactSQL.
Ejemplos
En los ejemplos siguientes se muestra cmo utilizar algunas condiciones de bsqueda comunes en la clusula WHERE.
A.Buscar una fila utilizando una igualdad simple
B.Buscar las filas que contienen un valor como una parte de una cadena
C.Buscar filas utilizando un operador de comparacin
D.Buscar las filas que cumplen alguna de tres condiciones
E.Buscar las filas que deben cumplir varias condiciones
SQL Server 2014
[ WHERE <sear ch_condi t i on>]
USE Advent ur eWor ks2012
GO
SELECT Pr oduct I D, Name
FROMPr oduct i on. Pr oduct
WHERE Name =' Bl ade' ;
GO
SELECT Pr oduct I D, Name, Col or
FROMPr oduct i on. Pr oduct
WHERE Name LI KE ( ' %Fr ame%' ) ;
GO
SELECT Pr oduct I D, Name
FROMPr oduct i on. Pr oduct
WHERE Pr oduct I D <=12 ;
GO
SELECT Pr oduct I D, Name
FROMPr oduct i on. Pr oduct
WHERE Pr oduct I D =2
OR Pr oduct I D =4
OR Name =' Spokes' ;
GO
SELECT Pr oduct I D, Name, Col or
FROMPr oduct i on. Pr oduct
WHERE Name LI KE ( ' %Fr ame%' )
F.Buscar las filas que estn en una lista de valores
G.Buscar las filas que tienen un valor comprendido entre dos valores
Vea tambin
Referencia
DELETE (Transact-SQL)
Predicados (Transact-SQL)
Condiciones de bsqueda TransactSQL
SELECT (Transact-SQL)
UPDATE (Transact-SQL)
MERGE (Transact-SQL)
2014 Microsoft
AND Name LI KE ( ' HL%' )
AND Col or =' Red' ;
GO
SELECT Pr oduct I D, Name, Col or
FROMPr oduct i on. Pr oduct
WHERE Name I N ( ' Bl ade' , ' Cr own Race' , ' Spokes' ) ;
GO
SELECT Pr oduct I D, Name, Col or
FROMPr oduct i on. Pr oduct
WHERE Pr oduct I D BETWEEN 725 AND 734;
GO
WITH common_table_expression (Transact-SQL)
Especifica un conjunto de resultados temporal con nombre, conocido como expresin de tabla comn CTE. Se deriva de una consulta simple y se define en el mbito de
ejecucin de una sola instruccin SELECT, INSERT, UPDATE o DELETE. Esta clusula tambin se puede utilizar en una instruccin CREATE VIEW como parte de la instruccin
SELECT que la define. Una expresin de tabla comn puede incluir referencias a ella misma. Esto se conoce como expresin de tabla comn recursiva.
Se aplica a: SQL Server (SQL Server 2008 a versin actual, Windows Azure SQL Database Versin inicial a versin actual).
Convenciones de sintaxis de Transact-SQL
Sintaxis
Argumentos
expression_name
Es un identificador vlido de la expresin de tabla comn. expression_namedebe ser diferente del nombre de cualquier otra expresin de tabla comn definida
en la misma clusula WITH <common_table_expression>, pero expression_name puede coincidir con el nombre de una vista o tabla base. Cualquier referencia a
expression_nameen la consulta utiliza la expresin de tabla comn y no el objeto base.
column_name
Especifica un nombre de columna en la expresin de tabla comn. No se permiten nombres duplicados en una misma definicin de CTE. El nmero de nombres
de columna especificado debe coincidir con el nmero de columnas del conjunto de resultados de CTE_query_definition. La lista de nombres de columna es
opcional solamente si en la definicin de la consulta se suministran nombres diferentes para todas las columnas resultantes.
CTE_query_definition
Especifica una instruccin SELECT cuyo conjunto de resultados llena la expresin de tabla comn. La instruccin SELECT de CTE_query_definition debe cumplir los
mismos requisitos que en la creacin de una vista, excepto que una expresin CTE no puede definir otra expresin CTE. Para obtener ms informacin, vea la
seccin Comentarios y el tema CREATE VIEW (Transact-SQL).
Si se definen varios parmetros CTE_query_definition, las definiciones de consulta deben combinarse mediante uno de estos operadores de conjunto: UNION ALL,
UNION, EXCEPT o INTERSECT.
Comentarios
Instrucciones para crear y utilizar expresiones de tabla comunes
Las instrucciones siguientes se aplican a expresiones de tabla comunes no recursivas. Para obtener instrucciones que se aplican a expresiones de tabla comunes
recursivas, vea "Instrucciones para definir y usar expresiones de tabla comunes recursivas" ms adelante.
Una expresin CTE debe ir seguida de una nica instruccin SELECT, INSERT, UPDATE o DELETE que haga referencia a una parte o a la totalidad de sus
columnas. Una expresin CTE tambin se puede especificar en una instruccin CREATE VIEW como parte de la instruccin SELECT de definicin de la vista.
Se pueden especificar varias definiciones de consulta de CTE en una CTE no recursiva. Las definiciones deben combinarse mediante uno de estos operadores de
conjuntos: UNION ALL, UNION, INTERSECT o EXCEPT.
Una expresin CTE puede hacer referencia a ella misma y a otras expresiones CTE previamente definidas en la misma clusula WITH. No se permite la referencia
adelantada.
No se permite especificar ms de una clusula WITH en una expresin CTE. Por ejemplo, si un argumento CTE_query_definition contiene una subconsulta, esta no
puede contener ninguna clusula WITH anidada que defina otra expresin CTE.
No se pueden utilizar las clusulas siguientes en la definicin de CTE_query_definition:
ORDER BY excepto cuando se especifica una clusula TOP
INTO
Clusula OPTION con sugerencias de consulta
FOR BROWSE
Cuando se utiliza una expresin CTE en una instruccin que forma parte de un lote, la instruccin que la precede debe ir seguida de punto y coma.
Una consulta que haga referencia a una CTE se puede utilizar para definir un cursor.
SQL Server 2014
[ WI TH <common_t abl e_expr essi on>[ , . . . n ] ]
<common_t abl e_expr essi on>: : =
expr essi on_name [ ( col umn_name [ , . . . n ] ) ]
AS
( CTE_quer y_def i ni t i on )
En la expresin CTE se puede hacer referencia a tablas de servidores remotos.
Cuando se ejecuta una CTE, todas las sugerencias que hagan referencia a ella pueden entrar en conflicto con otras sugerencias detectadas cuando la CTE tiene
acceso a sus tablas subyacentes, de la misma manera que las sugerencias que hacen referencia a vistas en las consultas. En ese caso, la consulta devuelve un
error.
Instrucciones para definir y usar expresiones de tabla comunes recursivas
Las instrucciones siguientes se aplican a la definicin de una expresin de tabla comn recursiva:
La definicin de la CTE recursiva debe contener al menos dos definiciones de consulta de CTE, un miembro no recursivo y un miembro recursivo. Se pueden
definir varios miembros no recursivos y recursivos, aunque todas las definiciones de consultas de miembros no recursivos deben colocarse delante de la
primera definicin de miembro recursivo. Todas las definiciones de consulta de CTE son miembros no recursivos a menos que hagan referencia a la propia CTE.
Los miembros no recursivos deben combinarse mediante uno de estos operadores de conjuntos: UNION ALL, UNION, INTERSECT o EXCEPT. UNION ALL es el
nico operador de conjuntos permitido entre el ltimo miembro no recursivo y el primer miembro recursivo, y si se combinan varios miembros recursivos.
El nmero de columnas de los miembros no recursivo y recursivo debe coincidir.
El tipo de datos de una columna del miembro recursivo debe ser igual al tipo de datos de la columna correspondiente en el miembro no recursivo.
La clusula FROM de un miembro recursivo solo debe hacer referencia una vez a expression_name de CTE.
No se permiten los siguientes elementos en el parmetro CTE_query_definition de un miembro recursivo:
SELECT DISTINCT
GROUP BY
PIVOT (cuando el nivel de compatibilidad de la base de datos sea 110 o superior. Vea Cambios recientes en las caractersticas del Motor de base de
datos de SQL Server 2014).
HAVING
Agregacin escalar
TOP
LEFT, RIGHT, OUTER JOIN (se permite INNER JOIN)
Subconsultas
Una sugerencia aplicada a una referencia recursiva a una CTE dentro de CTE_query_definition.
Las instrucciones siguientes se aplican al uso de una expresin de tabla comn recursiva:
Todas las columnas devueltas por la expresin CTE recursiva aceptan valores NULL independientemente de la nulabilidad de las columnas devueltas por las
instrucciones SELECT participantes.
Una expresin CTE formada incorrectamente puede generar un bucle infinito. Por ejemplo, si la definicin de la consulta del miembro recursivo devuelve los
mismos valores para las columnas primarias y secundarias, se crea un bucle infinito. Para evitar que se genere un bucle infinito, se puede limitar el nmero de
niveles de recursividad permitidos para una instruccin determinada mediante el uso de la sugerencia MAXRECURSION y un valor de 0 a 32.767 en la clusula
OPTION de la instruccin INSERT, UPDATE, DELETE o SELECT. De esta manera, se puede controlar la ejecucin de la instruccin hasta que se resuelva el
problema de cdigo que genera el bucle. El valor predeterminado de todo el servidor es 100. Cuando se especifica 0, no se aplica ningn lmite. Solo se puede
especificar un valor de MAXRECURSION por instruccin. Para obtener ms informacin, vea Sugerencias de consulta (Transact-SQL).
No se puede utilizar una vista que contenga una expresin de tabla comn recursiva para actualizar datos.
Se pueden definir cursores en las consultas que utilicen expresiones CTE. La expresin CTE es el argumento de select_statement que define el conjunto de
resultados del cursor. En el caso de las CTE recursivas nicamente se permiten los cursores de solo avance rpido y estticos de instantnea. Si se especifica
otro tipo de cursor en una CTE recursiva, el tipo de cursor se convierte a esttico.
En la expresin CTE se puede hacer referencia a tablas de servidores remotos. Si se hace referencia al servidor remoto en el miembro recursivo de la CTE, se
crea una cola para cada tabla remota de manera que se pueda tener acceso local a las tablas repetidas veces. Si es una consulta de CTE, aparecer Index
Spool/Lazy Spools en el plan de consulta y tendr el predicado adicional WITH STACK. Esta es una forma de confirmar la recursividad apropiada.
Las funciones analticas y de agregado de la parte recursiva del CTE se aplican al conjunto para el nivel de recursividad actual y no al conjunto para el CTE. Las
funciones como ROW_NUMBER solo funcionan sobre el subconjunto de datos que les pasa el nivel de recursividad actual y no sobre todo el conjunto de datos
pasados a la parte recursiva de la CTE. Para obtener ms informacin, vea el ejemplo K. Usar funciones analticas en una CTE recursiva que sigue.
Ejemplos
A.Crear una expresin de tabla comn simple
En el siguiente ejemplo se muestra el nmero total de pedidos de venta por ao para cada representante de ventas en Adventure Works Cycles.
- - Def i ne t he CTE expr essi on name and col umn l i st .
WI TH Sal es_CTE ( Sal esPer sonI D, Sal esOr der I D, Sal esYear )
AS
- - Def i ne t he CTE quer y.
B.Usar una expresin de tabla comn para limitar recuentos y promedios de informes
En el siguiente ejemplo se muestra el nmero medio de pedidos de venta correspondiente a todos los aos para los representantes de ventas.
C.Usar varias definiciones de CTE en una sola consulta
En el ejemplo siguiente se muestra cmo definir ms de una CTE en una sola consulta. Observe que se usa una coma para separar las definiciones de consulta CTE. La
funcin FORMAT, utilizada para mostrar las cantidades de moneda en un formato de moneda, est disponible en SQL Server 2012 y versiones posteriores.
A continuacin se muestra un conjunto de resultados parcial.
D.Usar una expresin de tabla comn recursiva para mostrar varios niveles de recursividad
(
SELECT Sal esPer sonI D, Sal esOr der I D, YEAR( Or der Dat e) AS Sal esYear
FROMSal es. Sal esOr der Header
WHERE Sal esPer sonI D I S NOT NULL
)
- - Def i ne t he out er quer y r ef er enci ng t he CTE name.
SELECT Sal esPer sonI D, COUNT( Sal esOr der I D) AS Tot al Sal es, Sal esYear
FROMSal es_CTE
GROUP BY Sal esYear , Sal esPer sonI D
ORDER BY Sal esPer sonI D, Sal esYear ;
GO
WI TH Sal es_CTE ( Sal esPer sonI D, Number Of Or der s)
AS
(
SELECT Sal esPer sonI D, COUNT( *)
FROMSal es. Sal esOr der Header
WHERE Sal esPer sonI D I S NOT NULL
GROUP BY Sal esPer sonI D
)
SELECT AVG( Number Of Or der s) AS "Aver age Sal es Per Per son"
FROMSal es_CTE;
GO
WI TH Sal es_CTE ( Sal esPer sonI D, Tot al Sal es, Sal esYear )
AS
- - Def i ne t he f i r st CTE quer y.
(
SELECT Sal esPer sonI D, SUM( Tot al Due) AS Tot al Sal es, YEAR( Or der Dat e) AS Sal esYear
FROMSal es. Sal esOr der Header
WHERE Sal esPer sonI D I S NOT NULL
GROUP BY Sal esPer sonI D, YEAR( Or der Dat e)
)
, - - Use a comma t o separ at e mul t i pl e CTE def i ni t i ons.
- - Def i ne t he second CTE quer y, whi ch r et ur ns sal es quot a dat a by year f or each sal es per son.
Sal es_Quot a_CTE ( Busi nessEnt i t yI D, Sal esQuot a, Sal esQuot aYear )
AS
(
SELECT Busi nessEnt i t yI D, SUM( Sal esQuot a) AS Sal esQuot a, YEAR( Quot aDat e) AS Sal esQuot aYear
FROMSal es. Sal esPer sonQuot aHi st or y
GROUP BY Busi nessEnt i t yI D, YEAR( Quot aDat e)
)
- - Def i ne t he out er quer y by r ef er enci ng col umns f r ombot h CTEs.
SELECT Sal esPer sonI D
, Sal esYear
, FORMAT( Tot al Sal es, ' C' , ' en- us' ) AS Tot al Sal es
, Sal esQuot aYear
, FORMAT ( Sal esQuot a, ' C' , ' en- us' ) AS Sal esQuot a
, FORMAT ( Tot al Sal es - Sal esQuot a, ' C' , ' en- us' ) AS Amt _Above_or _Bel ow_Quot a
FROMSal es_CTE
J OI N Sal es_Quot a_CTE ON Sal es_Quot a_CTE. Busi nessEnt i t yI D =Sal es_CTE. Sal esPer sonI D
AND Sal es_CTE. Sal esYear =Sal es_Quot a_CTE. Sal esQuot aYear
ORDER BY Sal esPer sonI D, Sal esYear ;
GO
Sal esPer sonI D Sal esYear Tot al Sal es Sal esQuot aYear Sal esQuot a Amt _Above_or _Bel ow_Quot a
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
274 2005 $32, 567. 92 2005 $35, 000. 00 ( $2, 432. 08)
274 2006 $406, 620. 07 2006 $455, 000. 00 ( $48, 379. 93)
274 2007 $515, 622. 91 2007 $544, 000. 00 ( $28, 377. 09)
274 2008 $281, 123. 55 2008 $271, 000. 00 $10, 123. 55
En el ejemplo siguiente se muestra la lista jerrquica de los directivos y de los empleados que tienen a su cargo. En el ejemplo se empieza creando y rellenando la
tabla dbo. MyEmpl oyees.
E.Usar una expresin de tabla comn recursiva para mostrar dos niveles de recursividad
En el ejemplo siguiente se muestran los directivos y los empleados que tienen a su cargo. El nmero de niveles devueltos est limitado a dos.
F.Usar una expresin de tabla comn recursiva para mostrar una lista jerrquica
El ejemplo siguiente, que est basado en el ejemplo D, agrega los nombres del directivo y de los empleados, y sus cargos respectivos. La jerarqua de directivos y
empleados se resalta ms mediante la aplicacin de sangras a cada nivel.
- - Cr eat e an Empl oyee t abl e.
CREATE TABLE dbo. MyEmpl oyees
(
Empl oyeeI D smal l i nt NOT NULL,
Fi r st Name nvar char ( 30) NOT NULL,
Last Name nvar char ( 40) NOT NULL,
Ti t l e nvar char ( 50) NOT NULL,
Dept I D smal l i nt NOT NULL,
Manager I D i nt NULL,
CONSTRAI NT PK_Empl oyeeI D PRI MARY KEY CLUSTERED ( Empl oyeeI D ASC)
) ;
- - Popul at e t he t abl e wi t h val ues.
I NSERT I NTO dbo. MyEmpl oyees VALUES
(1,N'Ken',N'Snchez',N'ChiefExecutiveOfficer',16,NULL)
, ( 273, N' Br i an' , N' Wel cker ' , N' Vi ce Pr esi dent of Sal es' , 3, 1)
, ( 274, N' St ephen' , N' J i ang' , N' Nor t h Amer i can Sal es Manager ' , 3, 273)
, ( 275, N' Mi chael ' , N' Bl yt he' , N' Sal es Repr esent at i ve' , 3, 274)
, ( 276, N' Li nda' , N' Mi t chel l ' , N' Sal es Repr esent at i ve' , 3, 274)
, ( 285, N' Syed' , N' Abbas' , N' Paci f i c Sal es Manager ' , 3, 273)
, ( 286, N' Lynn' , N' Tsof l i as' , N' Sal es Repr esent at i ve' , 3, 285)
, ( 16, N' Davi d' , N' Br adl ey' , N' Mar ket i ng Manager ' , 4, 273)
, ( 23, N' Mar y' , N' Gi bson' , N' Mar ket i ng Speci al i st ' , 4, 16) ;
USE Advent ur eWor ks2012;
GO
WI TH Di r ect Repor t s( Manager I D, Empl oyeeI D, Ti t l e, Empl oyeeLevel ) AS
(
SELECT Manager I D, Empl oyeeI D, Ti t l e, 0 AS Empl oyeeLevel
FROMdbo. MyEmpl oyees
WHERE Manager I D I S NULL
UNI ON ALL
SELECT e. Manager I D, e. Empl oyeeI D, e. Ti t l e, Empl oyeeLevel +1
FROMdbo. MyEmpl oyees AS e
I NNER J OI N Di r ect Repor t s AS d
ON e. Manager I D =d. Empl oyeeI D
)
SELECT Manager I D, Empl oyeeI D, Ti t l e, Empl oyeeLevel
FROMDi r ect Repor t s
ORDER BY Manager I D;
GO
USE Advent ur eWor ks2012;
GO
WI TH Di r ect Repor t s( Manager I D, Empl oyeeI D, Ti t l e, Empl oyeeLevel ) AS
(
SELECT Manager I D, Empl oyeeI D, Ti t l e, 0 AS Empl oyeeLevel
FROMdbo. MyEmpl oyees
WHERE Manager I D I S NULL
UNI ON ALL
SELECT e. Manager I D, e. Empl oyeeI D, e. Ti t l e, Empl oyeeLevel +1
FROMdbo. MyEmpl oyees AS e
I NNER J OI N Di r ect Repor t s AS d
ON e. Manager I D =d. Empl oyeeI D
)
SELECT Manager I D, Empl oyeeI D, Ti t l e, Empl oyeeLevel
FROMDi r ect Repor t s
WHERE Empl oyeeLevel <=2 ;
GO
USE Advent ur eWor ks2012;
GO
WI TH Di r ect Repor t s( Name, Ti t l e, Empl oyeeI D, Empl oyeeLevel , Sor t )
AS ( SELECT CONVERT( var char ( 255) , e. Fi r st Name +' ' +e. Last Name) ,
e. Ti t l e,
e. Empl oyeeI D,
G.Usar MAXRECURSION para cancelar una instruccin
MAXRECURSI ONse puede utilizar para impedir que una CTE recursiva con formato incorrecto entre en un bucle infinito. En el ejemplo siguiente se crea un bucle infinito
intencionadamente y se utiliza la sugerencia MAXRECURSI ONpara limitar el nmero de niveles de recursividad a dos.
Despus de corregir el error de cdigo, ya no se requiere MAXRECURSION. En el siguiente ejemplo se muestra el cdigo corregido.
H.Usar una expresin de tabla comn para recorrer selectivamente y paso a paso una relacin recursiva en una instruccin SELECT
En el ejemplo siguiente se muestra la jerarqua de ensamblados y componentes de producto necesarios para fabricar la bicicleta correspondiente a
Pr oduct Assembl yI D =800.
1,
CONVERT( var char ( 255) , e. Fi r st Name +' ' +e. Last Name)
FROMdbo. MyEmpl oyees AS e
WHERE e. Manager I D I S NULL
UNI ON ALL
SELECT CONVERT( var char ( 255) , REPLI CATE ( ' | ' , Empl oyeeLevel ) +
e. Fi r st Name +' ' +e. Last Name) ,
e. Ti t l e,
e. Empl oyeeI D,
Empl oyeeLevel +1,
CONVERT ( var char ( 255) , RTRI M( Sor t ) +' | ' +Fi r st Name +' ' +
Last Name)
FROMdbo. MyEmpl oyees AS e
J OI N Di r ect Repor t s AS d ON e. Manager I D =d. Empl oyeeI D
)
SELECT Empl oyeeI D, Name, Ti t l e, Empl oyeeLevel
FROMDi r ect Repor t s
ORDER BY Sor t ;
GO
USE Advent ur eWor ks2012;
GO
- - Cr eat es an i nf i ni t e l oop
WI TH ct e ( Empl oyeeI D, Manager I D, Ti t l e) as
(
SELECT Empl oyeeI D, Manager I D, Ti t l e
FROMdbo. MyEmpl oyees
WHERE Manager I D I S NOT NULL
UNI ON ALL
SELECT ct e. Empl oyeeI D, ct e. Manager I D, ct e. Ti t l e
FROMct e
J OI N dbo. MyEmpl oyees AS e
ON ct e. Manager I D =e. Empl oyeeI D
)
- - Uses MAXRECURSI ON t o l i mi t t he r ecur si ve l evel s t o 2
SELECT Empl oyeeI D, Manager I D, Ti t l e
FROMct e
OPTI ON ( MAXRECURSI ON 2) ;
GO
USE Advent ur eWor ks2012;
GO
WI TH ct e ( Empl oyeeI D, Manager I D, Ti t l e)
AS
(
SELECT Empl oyeeI D, Manager I D, Ti t l e
FROMdbo. MyEmpl oyees
WHERE Manager I D I S NOT NULL
UNI ON ALL
SELECT e. Empl oyeeI D, e. Manager I D, e. Ti t l e
FROMdbo. MyEmpl oyees AS e
J OI N ct e ON e. Manager I D =ct e. Empl oyeeI D
)
SELECT Empl oyeeI D, Manager I D, Ti t l e
FROMct e;
GO
USE Advent ur eWor ks2012;
GO
WI TH Par t s( Assembl yI D, Component I D, Per Assembl yQt y, EndDat e, Component Level ) AS
(
SELECT b. Pr oduct Assembl yI D, b. Component I D, b. Per Assembl yQt y,
b. EndDat e, 0 AS Component Level
FROMPr oduct i on. Bi l l Of Mat er i al s AS b
WHERE b. Pr oduct Assembl yI D =800
AND b. EndDat e I S NULL
UNI ON ALL
SELECT bom. Pr oduct Assembl yI D, bom. Component I D, p. Per Assembl yQt y,
I.Usar una CTE recursiva en una instruccin UPDATE
En el siguiente ejemplo se actualiza el valor de Per Assembl yQt y para todos los componentes que se utilizan para fabricar el producto 'Road-550-W Yellow, 44'
( Pr oduct Assembl yI D800). La expresin de tabla comn devuelve una lista jerrquica de los elementos que se utilizan para fabricar Pr oduct Assembl yI D 800 y los
componentes que se utilizan para crear esos elementos, etc. Solo se modifican las filas devueltas por la expresin de tabla comn.
J .Usar varios miembros no recursivos y recursivos
En el ejemplo siguiente se utilizan varios miembros no recursivos y recursivos para devolver todos los antecesores de una persona especificada. Se crea una tabla y se
insertan valores en ella para establecer la genealoga familiar devuelta por la CTE recursiva.
bom. EndDat e, Component Level +1
FROMPr oduct i on. Bi l l Of Mat er i al s AS bom
I NNER J OI N Par t s AS p
ON bom. Pr oduct Assembl yI D =p. Component I D
AND bom. EndDat e I S NULL
)
SELECT Assembl yI D, Component I D, Name, Per Assembl yQt y, EndDat e,
Component Level
FROMPar t s AS p
I NNER J OI N Pr oduct i on. Pr oduct AS pr
ON p. Component I D =pr . Pr oduct I D
ORDER BY Component Level , Assembl yI D, Component I D;
GO
USE Advent ur eWor ks2012;
GO
WI TH Par t s( Assembl yI D, Component I D, Per Assembl yQt y, EndDat e, Component Level ) AS
(
SELECT b. Pr oduct Assembl yI D, b. Component I D, b. Per Assembl yQt y,
b. EndDat e, 0 AS Component Level
FROMPr oduct i on. Bi l l Of Mat er i al s AS b
WHERE b. Pr oduct Assembl yI D =800
AND b. EndDat e I S NULL
UNI ON ALL
SELECT bom. Pr oduct Assembl yI D, bom. Component I D, p. Per Assembl yQt y,
bom. EndDat e, Component Level +1
FROMPr oduct i on. Bi l l Of Mat er i al s AS bom
I NNER J OI N Par t s AS p
ON bom. Pr oduct Assembl yI D =p. Component I D
AND bom. EndDat e I S NULL
)
UPDATE Pr oduct i on. Bi l l Of Mat er i al s
SET Per Assembl yQt y =c. Per Assembl yQt y * 2
FROMPr oduct i on. Bi l l Of Mat er i al s AS c
J OI N Par t s AS d ON c. Pr oduct Assembl yI D =d. Assembl yI D
WHERE d. Component Level =0;
- - Geneal ogy t abl e
I F OBJ ECT_I D( ' dbo. Per son' , ' U' ) I S NOT NULL DROP TABLE dbo. Per son;
GO
CREATE TABLE dbo. Per son( I D i nt , Name var char ( 30) , Mot her i nt , Fat her i nt ) ;
GO
I NSERT dbo. Per son
VALUES( 1, ' Sue' , NULL, NULL)
, ( 2, ' Ed' , NULL, NULL)
, ( 3, ' Emma' , 1, 2)
, ( 4, ' J ack' , 1, 2)
, ( 5, ' J ane' , NULL, NULL)
, ( 6, ' Bonni e' , 5, 4)
, ( 7, ' Bi l l ' , 5, 4) ;
GO
- - Cr eat e t he r ecur si ve CTE t o f i nd al l of Bonni e' s ancest or s.
WI TH Gener at i on ( I D) AS
(
- - Fi r st anchor member r et ur ns Bonni e' s mot her .
SELECT Mot her
FROMdbo. Per son
WHERE Name =' Bonni e'
UNI ON
- - Second anchor member r et ur ns Bonni e' s f at her .
SELECT Fat her
FROMdbo. Per son
WHERE Name =' Bonni e'
UNI ON ALL
- - Fi r st r ecur si ve member r et ur ns mal e ancest or s of t he pr evi ous gener at i on.
SELECT Per son. Fat her
FROMGener at i on, Per son
WHERE Gener at i on. I D=Per son. I D
UNI ON ALL
- - Second r ecur si ve member r et ur ns f emal e ancest or s of t he pr evi ous gener at i on.
SELECT Per son. Mot her
K.Utilizar funciones analticas en una CTE recursiva
En el siguiente ejemplo se muestra un error que puede producirse al utilizar una funcin analtica o de agregado en la parte recursiva de una CTE.
Los siguientes resultados son los esperados para la consulta.
Los siguientes resultados son los resultados reales de la consulta.
Ndevuelve 1 para cada paso de la parte recursiva del CTE, porque solo el subconjunto de datos para ese nivel de recursividad se pasa a ROWNUMBER. Por cada iteracin
de la parte recursiva de la consulta solo se pasa una fila a ROWNUMBER.
Vea tambin
FROMGener at i on, dbo. Per son
WHERE Gener at i on. I D=Per son. I D
)
SELECT Per son. I D, Per son. Name, Per son. Mot her , Per son. Fat her
FROMGener at i on, dbo. Per son
WHERE Gener at i on. I D =Per son. I D;
GO
DECLARE @t 1 TABLE ( i t mI D i nt , i t mI DComp i nt ) ;
I NSERT @t 1 VALUES ( 1, 10) , ( 2, 10) ;
DECLARE @t 2 TABLE ( i t mI D i nt , i t mI DComp i nt ) ;
I NSERT @t 2 VALUES ( 3, 10) , ( 4, 10) ;
WI TH vw AS
(
SELECT i t mI DComp, i t mI D
FROM@t 1
UNI ON ALL
SELECT i t mI DComp, i t mI D
FROM@t 2
)
, r AS
(
SELECT t . i t mI D AS i t mI DComp
, NULL AS i t mI D
, CAST( 0 AS bi gi nt ) AS N
, 1 AS Lvl
FROM( SELECT 1 UNI ON ALL SELECT 2 UNI ON ALL SELECT 3 UNI ON ALL SELECT 4) AS t ( i t mI D)
UNI ON ALL
SELECT t . i t mI DComp
, t . i t mI D
, ROW_NUMBER( ) OVER( PARTI TI ON BY t . i t mI DComp ORDER BY t . i t mI DComp, t . i t mI D) AS N
, Lvl +1
FROMr
J OI N vw AS t ON t . i t mI D =r . i t mI DComp
)
SELECT Lvl , N FROMr ;
Lvl N
1 0
1 0
1 0
1 0
2 4
2 3
2 2
2 1
Lvl N
1 0
1 0
1 0
1 0
2 1
2 1
2 1
2 1
Referencia
CREATE VIEW (Transact-SQL)
DELETE (Transact-SQL)
EXCEPT e INTERSECT (Transact-SQL)
INSERT (Transact-SQL)
SELECT (Transact-SQL)
UPDATE (Transact-SQL)
2014 Microsoft
WRITETEXT (Transact-SQL)
Permite la actualizacin interactiva de registro mnimo de una columna text, ntext o image existente. WRITETEXT sobrescribe completamente los datos existentes en la
columna afectada. No se puede utilizar WRITETEXT en las columnas text, ntext, e image de vistas.
Importante
Esta caracterstica se quitar en una versin futura de Microsoft SQL Server. Evite utilizar esta caracterstica en nuevos trabajos de desarrollo y tenga previsto modificar
las aplicaciones que actualmente la utilizan. Utilice los tipos de datos de valores grandes y la clusula .WRITE de la instruccin UPDATE, en su lugar.
Se aplica a: SQL Server SQL Server 2008 a travs de la versin actual).
Convenciones de sintaxis de Transact-SQL
Sintaxis
Argumentos
BULK
Hace posible que las herramientas de carga carguen flujos de datos binarios. La herramienta debe proporcionar flujos en el nivel de protocolo TDS. Cuando el
flujo de datos no est presente el procesador de consultas omite la opcin BULK.
Importante
Recomendamos que la opcin BULK no se utilice en las aplicaciones basadas en SQL Server. Es posible que esta opcin se modifique o quite en versiones
futuras de SQL Server.
table . column
Es el nombre de la tabla y de la columna text, ntext o image que se van a actualizar. Los nombres de tablas y columnas se deben ajustar a las reglas de los
identificadores. La especificacin de los nombres de la base de datos y del propietario es opcional.
text_ptr
Es un valor que almacena el puntero a los datos text, ntext o image. text_ptr debe ser de tipo binary(16). Para crear un puntero de texto, ejecute una
instruccin INSERT o UPDATE con datos que no sean NULL para la columna text, ntext o image.
WITH LOG
Omitido por SQL Server. El registro est determinado por el modelo de recuperacin vigente para la base de datos.
data
Son los datos de tipo text, ntext o image que se van a almacenar. data puede ser un literal o un parmetro. La longitud mxima de texto que se puede insertar
interactivamente con WRITETEXT es de 120 KB aproximadamente para datos de tipo text, ntext e image.
Comentarios
Utilice WRITETEXT para reemplazar datos de tipo text, ntext e image y UPDATETEXT para modificar datos de tipo text, ntext e image. UPDATETEXT es ms flexible
debido a que cambia solo una parte de una columna text, ntext o image en lugar de la columna completa.
Para obtener un rendimiento ptimo, se recomienda insertar o actualizar los datos de tipo text, ntext e imagepor partes que sean mltiplos de 8040 bytes.
Si el modelo de recuperacin de la base de datos es simple u optimizado para cargas masivas de registros, las operaciones text, ntext e image que usen WRITETEXT
se registrarn mnimamente cuando se inserten o se anexen datos nuevos.
Nota
El registro mnimo no se utiliza cuando se actualizan los datos existentes.
Para que WRITETEXT funcione correctamente, la columna ya debe contener un puntero de texto vlido.
Si en la tabla no existe texto de fila, SQL Server ahorra espacio al no inicializar las columnas text cuando se colocan valores NULL explcitos o implcitos en las columnas
text con INSERT, y no es posible obtener ningn puntero de texto para estos valores NULL. Para inicializar columnas text a NULL, utilice la instruccin UPDATE. Si en la
tabla existe texto de fila, no es necesario inicializar a valores NULL la columna de texto y siempre es posible obtener un puntero de texto.
La funcin SQLPutDatade ODBC es ms rpida y utiliza menos memoria dinmica que WRITETEXT. Esta funcin puede insertar hasta 2 gigabytes de datos de tipo text,
ntext o image.
En SQL Server, pueden existir punteros de texto de fila para datos de tipo text, ntext o image, pero es posible que no sean vlidos. Para obtener informacin acerca
de la opcin text in row, vea sp_tableoption (Transact-SQL). Para obtener informacin sobre cmo invalidar punteros de texto, vea sp_invalidate_textptr (Transact-SQL).
SQL Server 2014
WRI TETEXT [ BULK]
{ t abl e. col umn t ext _pt r }
[ WI TH LOG ] { dat a }
Permisos
Se requieren permisos UPDATE para la tabla especificada. El permiso se puede transferir cuando se transfiere el permiso UPDATE.
Ejemplos
En el ejemplo siguiente el puntero de texto se sita en la variable local @pt r val y, a continuacin, WRI TETEXT sita la nueva cadena de texto en la fila a la que seala
@pt r val .
Nota
Para ejecutar este ejemplo, debe instalar la base de datos de ejemplo pubs.
Vea tambin
Referencia
Tipos de datos (Transact-SQL)
DECLARE @local_variable (Transact-SQL)
DELETE (Transact-SQL)
SELECT (Transact-SQL)
Instrucciones SET (Transact-SQL)
UPDATETEXT (Transact-SQL)
2014 Microsoft
USE pubs;
GO
ALTER DATABASE pubs SET RECOVERY SI MPLE;
GO
DECLARE @pt r val bi nar y( 16) ;
SELECT @pt r val =TEXTPTR( pr _i nf o)
FROMpub_i nf o pr , publ i sher s p
WHERE p. pub_i d =pr . pub_i d
AND p. pub_name =' New Moon Books'
WRI TETEXT pub_i nf o. pr _i nf o @pt r val ' New Moon Books ( NMB) has j ust r el eased anot her t op t en publ i cat i on. Wi t h t he l at est publ i cat i on t hi s makes NMB t he hot t est new publ i sher of t he year ! ' ;
GO
ALTER DATABASE pubs SET RECOVERY SI MPLE;
GO

S-ar putea să vă placă și