Sunteți pe pagina 1din 51

Otros Comandos

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
Otros Comandos
BULK INSERT (Transact-SQL)
MERGE (Transact-SQL)
OUTPUT clusula de TransactSQL
READTEXT (Transact-SQL)
Condiciones de bsqueda TransactSQL
Constructor con valores de tabla (Transact-SQL)
TOP (Transact-SQL)
UPDATETEXT (Transact-SQL)
WITH common_table_expression (Transact-SQL)
WRITETEXT (Transact-SQL)
Otros Comandos
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
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
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%' ;
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
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
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