Sie sind auf Seite 1von 19

1

INSERT (Transact-SQL)
SQL Server 2014
Agrega una o varias filas a una tabla o una vista en SQL Server. Para obtener ejemplos, vea Ejemplos.
Se aplica a: SQL Server (SQL Server 2008 a versin actual), Windows Azure SQL Database (Versin
inicial a versin actual).
Convenciones de sintaxis de Transact-SQL
Sintaxis
[ WITH <common_table_expression> [ ,...n ] ]
INSERT
{
[ TOP ( expression ) [ PERCENT ] ]
[ INTO ]
{ <object> | rowset_function_limited
[ WITH ( <Table_Hint_Limited> [ ...n ] ) ]
}
{
[ ( column_list ) ]
[ <OUTPUT Clause> ]
{ VALUES ( { DEFAULT | NULL | expression } [ ,...n ] ) [ ,...n ]
| derived_table
| execute_statement
| <dml_table_source>
| DEFAULT VALUES
}
}
}
[;]
<object> ::=
{
[ server_name . database_name . schema_name .
| database_name .[ schema_name ] .
| schema_name .
]
table_or_view_name
}

<dml_table_source> ::=
SELECT <select_list>
FROM ( <dml_statement_with_output_clause> )
[AS] table_alias [ ( column_alias [ ,...n ] ) ]
[ WHERE <search_condition> ]
[ OPTION ( <query_hint> [ ,...n ] ) ]
-- External tool only syntax
INSERT
{
[BULK]
[ database_name . [ schema_name ] . | schema_name . ]
[ table_name | view_name ]
2

( <column_definition> )
[ WITH (
[ [ , ] CHECK_CONSTRAINTS ]
[ [ , ] FIRE_TRIGGERS ]
[ [ , ] KEEP_NULLS ]
[ [ , ] KILOBYTES_PER_BATCH = kilobytes_per_batch ]
[ [ , ] ROWS_PER_BATCH = rows_per_batch ]
[ [ , ] ORDER ( { column [ ASC | DESC ] } [ ,...n ] ) ]
[ [ , ] TABLOCK ]
) ]
}

[; ] <column_definition> ::=
column_name <data_type>
[ COLLATE collation_name ]
[ NULL | NOT NULL ]

<data type> ::=
[ type_schema_name . ] type_name
[ ( precision [ , scale ] | max ]
Argumentos
WITH <common_table_expression>
Especifica el conjunto de resultados con nombre temporal, denominado tambin expresin de tabla
comn, definido en el mbito de la instruccin INSERT. El conjunto de resultados se deriva de una
instruccin SELECT. Para obtener ms informacin, vea WITH common_table_expression (Transact-SQL).
TOP (expression) [ PERCENT ]
Especifica el nmero o el porcentaje de filas aleatorias que se van a insertar. expression puede ser un
nmero o un porcentaje de las filas. Para obtener ms informacin, vea TOP (Transact-SQL).
INTO
Es una palabra clave opcional que se puede utilizar entre INSERT y la tabla de destino.
server_name
Se aplica a: SQL Server 2008 a SQL Server 2014.
Es el nombre del servidor vinculado en el que se encuentra la tabla o la vista. server_name puede
especificarse como un nombre de servidor vinculadoo usando la funcin OPENDATASOURCE.
Cuando server_name se especifica como un servidor vinculado, se
requieren database_name y schema_name. Cuando server_name se especifica con
OPENDATASOURCE, database_name y schema_name pueden no aplicarse a todos los orgenes de datos y
estar sujetos a las capacidades del proveedor OLE DB que tiene acceso al objeto remoto.
database_name
Se aplica a: SQL Server 2008 a SQL Server 2014.
Es el nombre de la base de datos.
schema_name
Es el nombre del esquema al que pertenece la tabla o la vista.
table_or view_name
Es el nombre de la tabla o la vista que va a recibir los datos.
Se puede utilizar una variable de tabla, en su mbito, como origen de tabla en una instruccin INSERT.
La vista a la que hace referencia table_or_view_name debe poder actualizarse y debe hacer referencia
exactamente a una tabla base en la clusula FROM de la vista. Por ejemplo, la instruccin INSERT de una
vista de varias tablas debe utilizar una column_list que solamente haga referencia a columnas de una tabla
3

base. Para obtener ms informacin acerca de las vistas que se pueden actualizar, vea CREATE VIEW
(Transact-SQL).
rowset_function_limited
Se aplica a: SQL Server 2008 a SQL Server 2014.
Especifica la funcin OPENQUERY u OPENROWSET. El uso de estas funciones est sujeto a las capacidades
del proveedor OLE DB que tiene acceso al objeto remoto.
WITH ( <table_hint_limited> [... n ] )
Especifica una o varias sugerencias de tabla que estn permitidas en una tabla de destino. La palabra clave
WITH y los parntesis son obligatorios.
No se permiten READPAST, NOLOCK ni READUNCOMMITTED. Para obtener ms informacin acerca de las
sugerencias de tabla, vea Sugerencias de tabla (Transact-SQL).
Importante
La posibilidad de especificar las sugerencias HOLDLOCK, SERIALIZABLE,
READCOMMITTED, REPEATABLEREAD o UPDLOCK en tablas que son destinos de
instrucciones INSERT se quitar en una versin futura de SQL Server. Estas sugerencias no
influyen en el rendimiento de las instrucciones INSERT. Evite el uso de dichas sugerencias en
los nuevos trabajos de desarrollo y piense en modificar las aplicaciones que las utilizan
actualmente.
Especificar la sugerencia TABLOCK en una tabla que es el destino de una instruccin INSERT tiene el mismo
efecto que especificar la sugerencia TABLOCKX. Se realiza un bloqueo exclusivo en la tabla.
(column_list)
Es una lista de una o ms columnas donde se van a insertar los datos. column_list se debe incluir entre
parntesis y delimitar con comas.
Si la columna no se incluye en column_list, Motor de base de datos debe ser capaz de proporcionar un
valor basado en la definicin de la columna; de lo contrario, no se puede cargar la fila. Motor de base de
datos proporciona automticamente un valor para la columna si esta:
Tiene una propiedad IDENTITY. Se usa el valor de identidad incremental siguiente.
Tiene un valor predeterminado. Se usa el valor predeterminado de la columna.
Tiene un tipo de datos timestamp. Se utiliza el valor actual de marca de tiempo.
Admite valores NULL. Se usa un valor NULL.
Es una columna calculada. Se utiliza el valor calculado.
Se debe usar column_list al insertar valores explcitos en una columna de identidad. La opcin SET
IDENTITY_INSERT debe ser ON para la tabla.
Clusula OUTPUT
Devuelve las filas insertadas como parte de la operacin de insercin. Los resultados se pueden devolver a
la aplicacin de procesamiento o insertarse en una tabla o variable de tabla para su nuevo procesamiento.
La clusula OUTPUT no se admite en las instrucciones DML que hacen referencia a vistas locales con
particiones, vistas distribuidas con particiones, tablas remotas o instrucciones INSERT que contengan
una execute_statement. La clusula OUTPUT INTO no se admite en instrucciones INSERT que contengan una
clusula <dml_table_source>.
VALUES
Presenta la lista o listas de valores de datos que se van a insertar. Debe haber un valor de datos por cada
columna en column_list, si se especifica, o en la tabla. La lista de valores debe ir entre parntesis.
Si los valores de la lista Value no estn en el mismo orden que las columnas de la tabla o no contienen un
valor para cada columna de la tabla, se debe usar column_list para especificar de forma explcita la columna
que almacenar cada valor de entrada.
Puede utilizar el constructor de filas de Transact-SQL (que tambin se denomina constructor con valores de
tabla) para especificar varias filas en una nica instruccin INSERT. El constructor de filas se compone de
4

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

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

Indica el nmero aproximado de filas de datos del flujo de datos binarios. Para obtener ms informacin,
vea BULK INSERT (Transact-SQL).
Nota Se produce un error de sintaxis si no se proporciona una lista de columnas.
Prcticas recomendadas
Utilice la funcin @@ROWCOUNT para devolver el nmero de filas insertado a la aplicacin cliente. Para obtener
ms informacin, vea @@ROWCOUNT (Transact-SQL).
Prcticas recomendadas para la importacin masiva de datos
Usar INSERT INTOSELECT para realizar una importacin masiva de datos con registro mnimo
Puede usar INSERT INTO <target_table> SELECT <columns> FROM <source_table> para transferir eficazmente un
gran nmero de filas de una tabla, como una tabla de ensayo, a otra tabla con registro mnimo. El registro mnimo
puede mejorar el rendimiento de la instruccin y reducir la posibilidad de que la operacin rellene el espacio del
registro de transacciones disponible durante la transaccin.
El registro mnimo para esta instruccin tiene los requisitos siguientes:
El modelo de recuperacin de la base de datos est establecido en registro simple o masivo.
La tabla de destino es un montn vaco o no vaco.
La tabla de destino no se usa en la replicacin.
La sugerencia TABLOCK se especifica para la tabla de destino.
Las filas que se insertan en un montn como el resultado de una accin de insercin en una instruccin MERGE
tambin se pueden registrar con un nivel mnimo.
A diferencia de la instruccin BULK INSERT, que contiene un bloqueo Bulk Update menos restrictivo, INSERT
INTOSELECT con la sugerencia TABLOCK retiene un bloqueo exclusivo (X) en la tabla. Esto significa que no se
pueden insertar filas mediante operaciones de insercin en paralelo.
Usar OPENROWSET y BULK para datos de importacin masiva
La funcin OPENROWSET puede aceptar las siguientes sugerencias de tabla, que proporcionan optimizaciones de
carga masiva con la instruccin INSERT:
La sugerencia TABLOCK puede reducir al mnimo el nmero de registros para la operacin de insercin. El
modelo de recuperacin de la base de datos debe establecerse en registro simple o masivo, y la tabla de
destino no se puede utilizar en la replicacin. Para obtener ms informacin, veaRequisitos previos para el
registro mnimo durante la importacin masiva.
La sugerencia IGNORE_CONSTRAINTS puede deshabilitar temporalmente la comprobacin de restricciones
FOREIGN KEY y CHECK.
La sugerencia IGNORE_TRIGGERS puede deshabilitar temporalmente la ejecucin de desencadenadores.
La sugerencia KEEPDEFAULTS permite la insercin del valor predeterminado de la columna de una tabla, si
existe, en lugar de NULL, cuando falta el valor del registro de datos de esa columna.
La sugerencia KEEPIDENTITY permite que se usen los valores de identidad en el archivo de datos importado
para la columna de identidad en la tabla de destino.
Estas optimizaciones son similares a las que estn disponibles con el comando BULK INSERT. Para obtener ms
informacin, vea Sugerencias de tabla (Transact-SQL).
Tipos de datos
Al insertar filas, considere el comportamiento de los tipos de datos siguientes:
Si se va a cargar un valor en columnas con un tipo de datos char, varchar o varbinary, el relleno o el
truncamiento de los espacios en blanco finales (espacios para char y varchar, y ceros para varbinary)
se determinan mediante el valor de la opcin SET ANSI_PADDING definida para la columna al crear la
tabla. Para obtener ms informacin, vea SET ANSI_PADDING (Transact-SQL).
En la siguiente tabla se muestra la operacin predeterminada cuando SET ANSI_PADDING es OFF.
Tipo de
datos
Operacin predeterminada
char Rellena el valor con espacios hasta el ancho definido de la columna.
7

varchar Quita los espacios finales hasta el ltimo carcter distinto de espacio o hasta
un carcter de espacio nico para las cadenas compuestas solamente de
espacios.
varbinary Quita los ceros finales.
Si se carga una cadena vaca (' ') en una columna con un tipo de datos varchar o text, la operacin
predeterminada consiste en cargar una cadena de longitud cero.
Al insertar un valor NULL en una columna text o image, no se crea un puntero de texto vlido ni se
asigna previamente una pgina de texto de 8 KB.
En las columnas creadas con el tipo de datos uniqueidentifier se almacenan valores binarios de 16
bytes con formato especial. A diferencia de las columnas de identidad, Motor de base de datos no genera
automticamente valores de columnas con el tipo de datos uniqueidentifier. Durante una operacin
de insercin, se pueden usar variables con un tipo de datos uniqueidentifier y constantes de cadena
con el formato xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (36 caracteres incluidos los guiones, donde x es un
dgito hexadecimal de los intervalos 0-9 o a-f) para las columnasuniqueidentifier. Por ejemplo,
6F9619FF-8B86-D011-B42D-00C04FC964FF es un valor vlido para una columna o
variable uniqueidentifier. Utilice la funcin NEWID() para obtener un identificador nico global (GUID).
Insertar valores en columnas de tipo definido por el usuario
Puede insertar valores en columnas de tipo definido por el usuario si:
Proporciona un valor del tipo definido por el usuario.
Suministra un valor en un tipo de datos del sistema de SQL Server, siempre que el tipo definido por el
usuario admita la conversin implcita o explcita desde ese tipo. En el siguiente ejemplo se muestra cmo
insertar un valor en una columna de tipo definido por el usuario Point mediante la conversin explcita a
partir de una cadena.
INSERT INTO Cities (Location)
VALUES ( CONVERT(Point, '12.3:46.2') );
Tambin se puede suministrar un valor binario sin realizar ninguna conversin explcita, dado que todos los
tipos definidos por el usuario se pueden convertir implcitamente a partir de este valor binario.
Llama a una funcin definida por el usuario que devuelve un valor del tipo definido por el usuario. En el
siguiente ejemplo se utiliza una funcinCreateNewPoint() definida por el usuario para crear un valor
nuevo del tipo Point definido por el usuario e insertar el valor en la tabla Cities.
INSERT INTO Cities (Location)
VALUES ( dbo.CreateNewPoint(x, y) );
Tratamiento de errores
Puede implementar el tratamiento de errores para la instruccin INSERT especificando la instruccin en una
construccin TRYCATCH.
Si una instruccin INSERT infringe una restriccin o una regla, o si contiene un valor incompatible con el tipo de
datos de la columna, la instruccin no se puede ejecutar y se recibe un mensaje de error.
Si INSERT carga varias filas con SELECT o EXECUTE, cualquier infraccin de una regla o restriccin que se produzca
en los valores que se cargan provoca que se detenga la instruccin y que no se carguen filas.
Cuando una instruccin INSERT detecta un error aritmtico (desbordamiento, divisin entre cero o error de
dominio) al evaluar una expresin, Motor de base de datos trata dichos errores como si SET ARITHABORT estuviera
establecido en ON. El lote se detiene y se devuelve un mensaje de error. Al evaluar una expresin con SET
ARITHABORT y SET ANSI_WARNINGS en OFF, si una instruccin INSERT, DELETE o UPDATE encuentra un error
aritmtico, desbordamiento, divisin entre cero o error de dominio, SQL Server inserta o actualiza un valor NULL. Si
la columna de destino no acepta valores NULL, no se puede efectuar la accin de insercin o actualizacin y el
usuario recibe un error.
Interoperabilidad
8

Cuando se define un desencadenador INSTEAD OF en las acciones INSERT en una tabla o vista, se ejecuta el
desencadenador en lugar de la instruccin INSERT. Para obtener ms informacin acerca de los desencadenadores
INSTEAD OF, vea CREATE TRIGGER (Transact-SQL).
Limitaciones y restricciones
Cuando se insertan valores en tablas remotas y no se especifican todos los valores de todas las columnas, debe
identificar las columnas en las que se deben insertar los valores especificados.
Cuando se utiliza TOP con INSERT las filas a las que hace referencia no estn organizadas de ninguna manera y la
clusula ORDER BY no se puede especificar directamente en esta instruccin. Si necesita usar TOP para insertar las
filas en un orden cronolgico significativo, debe utilizar TOP junto con una clusula ORDER BY que se especifica en
una instruccin de subseleccin. Vea la seccin Ejemplos que aparece ms adelante en este tema.
Comportamiento del registro
La instruccin INSERT siempre se registra completamente excepto cuando se usa la funcin OPENROWSET con la
palabra clave BULK o cuando se usa INSERT INTO <target_table> SELECT <columns> FROM <source_table>. Estas
operaciones pueden ser registradas mnimamente. Para obtener ms informacin, vea la seccin "Prcticas
recomendadas para la carga masiva de datos" anteriormente en este tema.
Seguridad
Durante una conexin de servidores vinculados, el servidor de envo proporciona un nombre de inicio de sesin y
una contrasea para conectarse en su nombre al servidor de recepcin. Para que esta conexin funcione, debe
crear una asignacin de inicio de sesin entre los servidores vinculados utilizandosp_addlinkedsrvlogin.
Cuando utilice OPENROWSET (BULK), es importante que entienda el modo en el que SQL Server controla la
suplantacin. Para obtener ms informacin, vea "Consideraciones de seguridad" en Importar de forma masiva
datos mediante BULK INSERT u OPENROWSET(BULK...) (SQL Server).
Permisos
El permiso INSERT es obligatorio en la tabla de destino.
Los permisos para INSERT se adjudican de forma predeterminada a los miembros del rol fijo de
servidor sysadmin, a los roles fijos de base de datosdb_owner y db_datawriter, y al propietario de la
tabla. Los miembros de los roles sysadmin, db_owner y db_securityadmin, y el propietario de la tabla
pueden transferir permisos a otros usuarios.
Para ejecutar INSERT con la opcin BULK de la funcin OPENROWSET, debe ser miembro del rol fijo de
servidor sysadmin o bulkadmin.
Ejemplos
Categora Elementos de sintaxis ofrecidos
Sintaxis bsica INSERT constructor con valores de tabla
Tratar los valores de columna IDENTITY NEWID valores predeterminados
tipos definidos por el usuario
Insertar datos de otras tablas INSERTSELECT INSERTEXECUTE
WITH expresin de tabla comn TOP OFFSET
FETCH
Especificar objetos de destino que no sean
tablas estndar
Vistas variables de tabla
Insertar filas en una tabla remota Servidor vinculado funcin de conjunto de filas
OPENQUERY funcin de conjunto de filas
9

OPENDATASOURCE
Cargar datos de forma masiva de tablas o
archivos de datos
INSERTSELECT funcin OPENROWSET
Invalidar el comportamiento predeterminado
del optimizador de consultas mediante
sugerencias
Sugerencias de tabla
Capturar los resultados de la instruccin
INSERT
Clusula OUTPUT
Sintaxis bsica
Los ejemplos de esta seccin demuestran la funcionalidad bsica de la instruccin INSERT usando la sintaxis
mnima requerida.
A.Insertar una sola fila de datos
En el siguiente ejemplo se inserta una fila en la tabla Production.UnitMeasure en la base de datos
AdventureWorks2012. Las columnas de esta tabla sonUnitMeasureCode, Name y ModifiedDate. Dado que los
valores para todas las columnas se suministran e incluyen en el mismo orden que las columnas de la tabla, no es
necesario especificar los nombres de columna en la lista de columnas.
INSERT INTO Production.UnitMeasure
VALUES (N'FT', N'Feet', '20080414');
B.Insertar varias filas de datos
En el ejemplo siguiente se usa el constructor de valores de tabla para insertar tres filas en la
tabla Production.UnitMeasure de la base de datos AdventureWorks2012 en una sola instruccin INSERT. Dado
que los valores para todas las columnas se suministran e incluyen en el mismo orden que las columnas de la tabla,
no es necesario especificar los nombres de columna en la lista de columnas.
INSERT INTO Production.UnitMeasure
VALUES (N'FT2', N'Square Feet ', '20080923'), (N'Y', N'Yards', '20080923'), (N'Y3',
N'Cubic Yards', '20080923');
C.Insertar datos que no estn en el mismo orden que las columnas de la tabla
En el siguiente ejemplo se utiliza una lista de columnas para especificar de forma explcita los valores insertados en
cada columna. El orden de las columnas de la tabla Production.UnitMeasure en la base de datos
AdventureWorks2012 es, UnitMeasureCode, Name, ModifiedDate; no obstante, las columnas no se incluyen en
dicho orden en column_list.
INSERT INTO Production.UnitMeasure (Name, UnitMeasureCode,
ModifiedDate)
VALUES (N'Square Yards', N'Y2', GETDATE());
Tratar los valores de columna
Los ejemplos de esta seccin demuestran mtodos para insertar valores en columnas que se definen con una
propiedad IDENTITY, un valor DEFAULT o se definen con tipos de datos como uniqueidentifer o columnas de
un tipo definido por el usuario.
A.Insertar datos en una tabla con columnas que tienen valores predeterminados
En el ejemplo siguiente se muestra la insercin de filas en una tabla con columnas que generan automticamente
un valor o tienen un valor predeterminado.Column_1 es una columna calculada que genera automticamente un
valor concatenando una cadena con el valor insertado en column_2. Column_2 se define con una restriccin
predeterminada. Si no se especifica un valor para esta columna, se usar el valor predeterminado. Column_3 se
define con el tipo de datos rowversion, que genera automticamente un nmero binario nico que se
incrementa. Column_4 no genera automticamente ningn valor. Cuando no se especifica un valor para esta
columna, se inserta NULL. La instruccin INSERT inserta filas que contienen valores para algunas de las columnas,
10

pero no para todas. En la ltima instruccin INSERT, no se especifica ninguna columna y solamente se insertan los
valores predeterminados con la clusula DEFAULT VALUES.
IF OBJECT_ID ('dbo.T1', 'U') IS NOT NULL
DROP TABLE dbo.T1;
GO
CREATE TABLE dbo.T1
(
column_1 AS 'Computed column ' + column_2,
column_2 varchar(30)
CONSTRAINT default_name DEFAULT ('my column default'),
column_3 rowversion,
column_4 varchar(40) NULL
);
GO
INSERT INTO dbo.T1 (column_4)
VALUES ('Explicit value');
INSERT INTO dbo.T1 (column_2, column_4)
VALUES ('Explicit value', 'Explicit value');
INSERT INTO dbo.T1 (column_2)
VALUES ('Explicit value');
INSERT INTO T1 DEFAULT VALUES;
GO
SELECT column_1, column_2, column_3, column_4
FROM dbo.T1;
GO
B.Insertar datos en una tabla con una columna de identidad
En el siguiente ejemplo se muestran los distintos mtodos para insertar datos en una columna de identidad. Las
dos primeras instrucciones INSERT permiten generar valores de identidad para las filas nuevas. La tercera
instruccin INSERT invalida la propiedad IDENTITY de la columna con la instruccin SET IDENTITY_INSERT e inserta
un valor explcito en la columna de identidad.
IF OBJECT_ID ('dbo.T1', 'U') IS NOT NULL
DROP TABLE dbo.T1;
GO
CREATE TABLE dbo.T1 ( column_1 int IDENTITY, column_2 VARCHAR(30));
GO
INSERT T1 VALUES ('Row #1');
INSERT T1 (column_2) VALUES ('Row #2');
GO
SET IDENTITY_INSERT T1 ON;
GO
INSERT INTO T1 (column_1,column_2)
VALUES (-99, 'Explicit identity value');
GO
SELECT column_1, column_2
FROM T1;
GO
C.Insertar datos en una columna uniqueidentifier mediante NEWID()
En el siguiente ejemplo se utiliza la funcin NEWID() para obtener un GUID para column_2. A diferencia de las
columnas de identidad, Motor de base de datos no genera automticamente valores de columnas con el tipo de
datos uniqueidentifier, segn se muestra en la segunda instruccin INSERT.
IF OBJECT_ID ('dbo.T1', 'U') IS NOT NULL
DROP TABLE dbo.T1;
GO
11

CREATE TABLE dbo.T1
(
column_1 int IDENTITY,
column_2 uniqueidentifier,
);
GO
INSERT INTO dbo.T1 (column_2)
VALUES (NEWID());
INSERT INTO T1 DEFAULT VALUES;
GO
SELECT column_1, column_2
FROM dbo.T1;
D.Insertar datos en columnas de tipo definido por el usuario
Las siguientes instrucciones de Transact-SQL insertan tres filas en la columna PointValue de la tabla Points. Esta
columna usa un tipo definido por el usuario CLR (UDT). El tipo de datos Point est compuesto por valores enteros
X e Y que se exponen como propiedades del UDT. Debe utilizar las funciones CAST o CONVERT para convertir los
valores X e Y separados por comas al tipo Point. Las dos primeras instrucciones utilizan la funcin CONVERT para
convertir un valor de cadena al tipo Point y la tercera utiliza la funcin CAST. Para obtener ms informacin,
vea Manipular datos UDT.
INSERT INTO dbo.Points (PointValue) VALUES (CONVERT(Point, '3,4'));
INSERT INTO dbo.Points (PointValue) VALUES (CONVERT(Point, '1,5'));
INSERT INTO dbo.Points (PointValue) VALUES (CAST ('1,99' AS Point));
Insertar datos de otras tablas
Los ejemplos de esta seccin demuestran mtodos para insertar filas de una tabla en otra.
A.Usar las opciones SELECT y EXECUTE para insertar datos de otras tablas
En el siguiente ejemplo se muestra cmo insertar datos de una tabla en otra mediante INSERTSELECT o
INSERTEXECUTE. Cada uno se basa en una instruccin SELECT con varias tablas que contiene una expresin y un
valor literal en la lista de columnas.
La primera instruccin INSERT usa una instruccin SELECT para derivar los datos de las tablas de origen
(Employee, SalesPerson y Person) en la base de datos AdventureWorks2012 y almacenar el conjunto de
resultados en la tabla EmployeeSales . La segunda instruccin INSERT usa la clusula EXECUTE para llamar a un
procedimiento almacenado que contiene la instruccin SELECT y la tercera instruccin INSERT usa la clusula
EXECUTE para hacer referencia a la instruccin SELECT como una cadena literal.
IF OBJECT_ID ('dbo.EmployeeSales', 'U') IS NOT NULL
DROP TABLE dbo.EmployeeSales;
GO
IF OBJECT_ID ('dbo.uspGetEmployeeSales', 'P') IS NOT NULL
DROP PROCEDURE uspGetEmployeeSales;
GO
CREATE TABLE dbo.EmployeeSales
( DataSource varchar(20) NOT NULL,
BusinessEntityID varchar(11) NOT NULL,
LastName varchar(40) NOT NULL,
SalesDollars money NOT NULL
);
GO
CREATE PROCEDURE dbo.uspGetEmployeeSales
AS
SET NOCOUNT ON;
SELECT 'PROCEDURE', sp.BusinessEntityID, c.LastName,
sp.SalesYTD
FROM Sales.SalesPerson AS sp
INNER JOIN Person.Person AS c
12

ON sp.BusinessEntityID = c.BusinessEntityID
WHERE sp.BusinessEntityID LIKE '2%'
ORDER BY sp.BusinessEntityID, c.LastName;
GO
--INSERT...SELECT example
INSERT INTO dbo.EmployeeSales
SELECT 'SELECT', sp.BusinessEntityID, c.LastName, sp.SalesYTD
FROM Sales.SalesPerson AS sp
INNER JOIN Person.Person AS c
ON sp.BusinessEntityID = c.BusinessEntityID
WHERE sp.BusinessEntityID LIKE '2%'
ORDER BY sp.BusinessEntityID, c.LastName;
GO
--INSERT...EXECUTE procedure example
INSERT INTO dbo.EmployeeSales
EXECUTE dbo.uspGetEmployeeSales;
GO
--INSERT...EXECUTE('string') example
INSERT INTO dbo.EmployeeSales
EXECUTE
('
SELECT ''EXEC STRING'', sp.BusinessEntityID, c.LastName,
sp.SalesYTD
FROM Sales.SalesPerson AS sp
INNER JOIN Person.Person AS c
ON sp.BusinessEntityID = c.BusinessEntityID
WHERE sp.BusinessEntityID LIKE ''2%''
ORDER BY sp.BusinessEntityID, c.LastName
');
GO
--Show results.
SELECT DataSource,BusinessEntityID,LastName,SalesDollars
FROM dbo.EmployeeSales;
B.Usar la expresin de tabla comn WITH para definir los datos insertados
En el siguiente ejemplo se crea la tabla NewEmployee en la base de datos AdventureWorks2012. Una expresin de
tabla comn (EmployeeTemp) define las filas de una o varias tablas que se van a insertar en la
tabla NewEmployee. La instruccin INSERT hace referencia a las columnas de la expresin de tabla comn.
IF OBJECT_ID (N'HumanResources.NewEmployee', N'U') IS NOT NULL
DROP TABLE HumanResources.NewEmployee;
GO
CREATE TABLE HumanResources.NewEmployee
(
EmployeeID int NOT NULL,
LastName nvarchar(50) NOT NULL,
FirstName nvarchar(50) NOT NULL,
PhoneNumber Phone NULL,
AddressLine1 nvarchar(60) NOT NULL,
City nvarchar(30) NOT NULL,
State nchar(3) NOT NULL,
PostalCode nvarchar(15) NOT NULL,
CurrentFlag Flag
);
GO
WITH EmployeeTemp (EmpID, LastName, FirstName, Phone,
13

Address, City, StateProvince,
PostalCode, CurrentFlag)
AS (SELECT
e.BusinessEntityID, c.LastName, c.FirstName, pp.PhoneNumber,
a.AddressLine1, a.City, sp.StateProvinceCode,
a.PostalCode, e.CurrentFlag
FROM HumanResources.Employee e
INNER JOIN Person.BusinessEntityAddress AS bea
ON e.BusinessEntityID = bea.BusinessEntityID
INNER JOIN Person.Address AS a
ON bea.AddressID = a.AddressID
INNER JOIN Person.PersonPhone AS pp
ON e.BusinessEntityID = pp.BusinessEntityID
INNER JOIN Person.StateProvince AS sp
ON a.StateProvinceID = sp.StateProvinceID
INNER JOIN Person.Person as c
ON e.BusinessEntityID = c.BusinessEntityID
)
INSERT INTO HumanResources.NewEmployee
SELECT EmpID, LastName, FirstName, Phone,
Address, City, StateProvince, PostalCode, CurrentFlag
FROM EmployeeTemp;
GO
C.Usar TOP para limitar los datos insertados de la tabla de origen
En el siguiente ejemplo se crea la tabla EmployeeSales y se insertan el nombre y los datos de ventas del ao hasta
la fecha para los primeros 5 empleados aleatorios de la tabla HumanResources.Employee en la base de datos
AdventureWorks2012. La instruccin INSERT elige cualquiera de las 5 filas devueltas por la instruccin SELECT. La
clusula OUTPUT muestra las filas que se insertan en la tabla EmployeeSales. Observe que la clusula ORDER BY
de la instruccin SELECT no se utiliza para determinar los primeros 5 empleados.
IF OBJECT_ID ('dbo.EmployeeSales', 'U') IS NOT NULL
DROP TABLE dbo.EmployeeSales;
GO
CREATE TABLE dbo.EmployeeSales
( EmployeeID nvarchar(11) NOT NULL,
LastName nvarchar(20) NOT NULL,
FirstName nvarchar(20) NOT NULL,
YearlySales money NOT NULL
);
GO
INSERT TOP(5)INTO dbo.EmployeeSales
OUTPUT inserted.EmployeeID, inserted.FirstName, inserted.LastName,
inserted.YearlySales
SELECT sp.BusinessEntityID, c.LastName, c.FirstName, sp.SalesYTD
FROM Sales.SalesPerson AS sp
INNER JOIN Person.Person AS c
ON sp.BusinessEntityID = c.BusinessEntityID
WHERE sp.SalesYTD > 250000.00
ORDER BY sp.SalesYTD DESC;
Si necesita usar TOP para insertar las filas en un orden cronolgico significativo, debe utilizar TOP junto con ORDER
BY en una instruccin de subseleccin, tal y como se muestra en el siguiente ejemplo. La clusula OUTPUT muestra
las filas que se insertan en la tabla EmployeeSales. Observe que los primeros 5 empleados se insertan ahora segn
los resultados de la clusula ORDER BY en lugar de las filas aleatorias.
INSERT INTO dbo.EmployeeSales
14

OUTPUT inserted.EmployeeID, inserted.FirstName, inserted.LastName,
inserted.YearlySales
SELECT TOP (5) sp.BusinessEntityID, c.LastName, c.FirstName, sp.SalesYTD
FROM Sales.SalesPerson AS sp
INNER JOIN Person.Person AS c
ON sp.BusinessEntityID = c.BusinessEntityID
WHERE sp.SalesYTD > 250000.00
ORDER BY sp.SalesYTD DESC;
Especificar objetos de destino que no sean tablas estndar
En los ejemplos de esta seccin se muestra cmo insertar filas especificando una variable de tabla o vista.
A.Insertar datos especificando una vista
En el siguiente ejemplo se especifica un nombre de vista como objeto de destino; sin embargo, la fila nueva se
inserta en la tabla base subyacente. El orden de los valores de la instruccin INSERT debe coincidir con el orden de
las columnas de la vista. Para obtener ms informacin, vea Modificar datos mediante una vista.
IF OBJECT_ID ('dbo.T1', 'U') IS NOT NULL
DROP TABLE dbo.T1;
GO
IF OBJECT_ID ('dbo.V1', 'V') IS NOT NULL
DROP VIEW dbo.V1;
GO
CREATE TABLE T1 ( column_1 int, column_2 varchar(30));
GO
CREATE VIEW V1 AS
SELECT column_2, column_1
FROM T1;
GO
INSERT INTO V1
VALUES ('Row 1',1);
GO
SELECT column_1, column_2
FROM T1;
GO
SELECT column_1, column_2
FROM V1;
GO
B.Insertar datos en una variable de tabla
En el siguiente ejemplo se especifica una variable de tabla como el objeto de destino en la base de datos
AdventureWorks2012.
-- Create the table variable.
DECLARE @MyTableVar table(
LocationID int NOT NULL,
CostRate smallmoney NOT NULL,
NewCostRate AS CostRate * 1.5,
ModifiedDate datetime);

-- Insert values into the table variable.
INSERT INTO @MyTableVar (LocationID, CostRate, ModifiedDate)
SELECT LocationID, CostRate, GETDATE() FROM Production.Location
WHERE CostRate > 0;

-- View the table variable result set.
SELECT * FROM @MyTableVar;
GO
15

Insertar filas en una tabla remota
Los ejemplos de esta seccin demuestran cmo insertar filas en una tabla de destino remota mediante un servidor
vinculado o una funcin de conjunto de filas para hacer referencia a la tabla remota.
A.Insertar datos en una tabla remota mediante un servidor vinculado
El ejemplo siguiente inserta filas en una tabla remota. En el ejemplo se comienza creando un vnculo al origen de
datos remoto mediante sp_addlinkedserver.El nombre del servidor vinculado, MyLinkServer, se especifica
entonces como parte del nombre de objeto de cuatro partes en el formatoserver.catalog.schema.object.
Se aplica a: SQL Server 2008 a SQL Server 2014.
USE master;
GO
-- Create a link to the remote data source.
-- Specify a valid server name for @datasrc as 'server_name' or
'server_name\instance_name'.

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

INSERT INTO MyLinkServer.AdventureWorks2012.HumanResources.Department (Name,
GroupName)
VALUES (N'Public Relations', N'Executive General and Administration');
GO
B.Insertar datos en una tabla remota con una funcin OPENQUERY
En el ejemplo siguiente se inserta una fila en una tabla remota especificando la funcin de conjunto de
filas OPENQUERY. En este ejemplo se usa el nombre del servidor vinculado creado en el ejemplo anterior.
Se aplica a: SQL Server 2008 a SQL Server 2014.
INSERT OPENQUERY (MyLinkServer, 'SELECT Name, GroupName FROM
AdventureWorks2012.HumanResources.Department')
VALUES ('Environmental Impact', 'Engineering');
GO
C.Insertar datos en una tabla remota con una funcin OPENDATASOURCE
En el ejemplo siguiente se inserta una fila en una tabla remota especificando la funcin de conjunto de
filas OPENDATASOURCE. Especifique un nombre de servidor vlido para el origen de datos con el
formato server_name o server_name\instance_name.
Se aplica a: SQL Server 2008 a SQL Server 2014.
-- Use the OPENDATASOURCE function to specify the remote data source.
-- Specify a valid server name for Data Source using the format server_name or
server_name\instance_name.

INSERT INTO OPENDATASOURCE('SQLNCLI',
'Data Source= <server_name>; Integrated Security=SSPI')
.AdventureWorks2012.HumanResources.Department (Name, GroupName)
VALUES (N'Standards and Methods', 'Quality Assurance');
16

GO
Cargar datos de forma masiva de tablas o archivos de datos
Los ejemplos de esta seccin muestran dos mtodos para cargar datos de forma masiva en una tabla mediante la
instruccin INSERT.
A.Insertar datos en un montn con registro mnimo
El ejemplo siguiente crea una tabla nueva (un montn) e inserta los datos en ella desde otra tabla con registro
mnimo. El ejemplo supone que el modelo de recuperacin de la base de datos AdventureWorks2012 est
establecido en FULL. Para asegurarse de que se utiliza el registro mnimo, el modelo de recuperacin de la base de
datos AdventureWorks2012 se establece en BULK_LOGGED antes de que las filas se inserten y se restablece en
FULL despus de la instruccin INSERT INTOSELECT. Adems, se especifica la sugerencia TABLOCK para la tabla
de destino Sales.SalesHistory. Esto asegura que la instruccin use el espacio mnimo en el registro de
transacciones y funcione eficazmente.
-- Create the target heap.
CREATE TABLE Sales.SalesHistory(
SalesOrderID int NOT NULL,
SalesOrderDetailID int NOT NULL,
CarrierTrackingNumber nvarchar(25) NULL,
OrderQty smallint NOT NULL,
ProductID int NOT NULL,
SpecialOfferID int NOT NULL,
UnitPrice money NOT NULL,
UnitPriceDiscount money NOT NULL,
LineTotal money NOT NULL,
rowguid uniqueidentifier ROWGUIDCOL NOT NULL,
ModifiedDate datetime NOT NULL );
GO
-- Temporarily set the recovery model to BULK_LOGGED.
ALTER DATABASE AdventureWorks2012
SET RECOVERY BULK_LOGGED;
GO
-- Transfer data from Sales.SalesOrderDetail to Sales.SalesHistory
INSERT INTO Sales.SalesHistory WITH (TABLOCK)
(SalesOrderID,
SalesOrderDetailID,
CarrierTrackingNumber,
OrderQty,
ProductID,
SpecialOfferID,
UnitPrice,
UnitPriceDiscount,
LineTotal,
rowguid,
ModifiedDate)
SELECT * FROM Sales.SalesOrderDetail;
GO
-- Reset the recovery model.
ALTER DATABASE AdventureWorks2012
SET RECOVERY FULL;
GO
B.Usar la funcin OPENROWSET con BULK para cargar datos de forma masiva en una tabla
En el ejemplo siguiente se insertan filas de un archivo de datos en una tabla especificando la funcin
OPENROWSET. La sugerencia de tabla IGNORE_TRIGGERS se especifica para la optimizacin del rendimiento. Para
17

obtener ms ejemplos, vea Importar de forma masiva datos mediante BULK INSERT u OPENROWSET(BULK...) (SQL
Server).
Se aplica a: SQL Server 2008 a SQL Server 2014.
-- Use the OPENROWSET function to specify the data source and specifies the
IGNORE_TRIGGERS table hint.
INSERT INTO HumanResources.Department WITH (IGNORE_TRIGGERS) (Name, GroupName)
SELECT b.Name, b.GroupName
FROM OPENROWSET (
BULK 'C:\SQLFiles\DepartmentData.txt',
FORMATFILE = 'C:\SQLFiles\BulkloadFormatFile.xml',
ROWS_PER_BATCH = 15000)AS b ;
Invalidar el comportamiento predeterminado del optimizador de consultas mediante
sugerencias
Los ejemplos de esta seccin demuestran cmo usar sugerencias de tabla para invalidar de forma temporal el
comportamiento predeterminado del optimizador de consultas cuando se procesa la instruccin INSERT.
Advertencia
Como el optimizador de consultas de SQL Server suele seleccionar el mejor plan de ejecucin de una
consulta, se recomienda que nicamente los administradores de bases de datos y desarrolladores
experimentados utilicen las sugerencias como ltimo recurso.
A.Usar la sugerencia TABLOCK para especificar un mtodo de bloqueo
En el ejemplo siguiente se especifica que se aplique un bloqueo exclusivo (X) en la tabla Production.Location y que
se mantenga hasta que finalice la instruccin INSERT.
INSERT INTO Production.Location WITH (XLOCK)
(Name, CostRate, Availability)
VALUES ( N'Final Inventory', 15.00, 80.00);
Capturar los resultados de la instruccin INSERT
Los ejemplos de esta seccin demuestran cmo usar la clusula OUTPUT para devolver informacin de cada fila
afectada por una instruccin INSERT o de expresiones que se basan en esta instruccin. Estos resultados se pueden
devolver a la aplicacin de procesamiento para que los utilice en mensajes de confirmacin, archivado y otros
requisitos similares de una aplicacin.
A. Usar OUTPUT con una instruccin INSERT
En el siguiente ejemplo se inserta una fila en la tabla ScrapReason y se utiliza la clusula OUTPUT para devolver los
resultados de la instruccin a la variable de la tabla @MyTableVar. Dado que la columna ScrapReasonID se define
con una propiedad IDENTITY, no se especifica ningn valor en la instruccin INSERTpara dicha columna. No
obstante, debe tener en cuenta que el valor generado por Motor de base de datos para la columna se devuelve en
la clusulaOUTPUT de la columna INSERTED.ScrapReasonID.
DECLARE @MyTableVar table( NewScrapReasonID smallint,
Name varchar(50),
ModifiedDate datetime);
INSERT Production.ScrapReason
OUTPUT INSERTED.ScrapReasonID, INSERTED.Name, INSERTED.ModifiedDate
INTO @MyTableVar
VALUES (N'Operator error', GETDATE());

--Display the result set of the table variable.
SELECT NewScrapReasonID, Name, ModifiedDate FROM @MyTableVar;
--Display the result set of the table.
18

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

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

SELECT LastName, FirstName, CurrentSales
FROM @MyTableVar;
GO
SELECT EmployeeID, LastName, FirstName, CurrentSales, ProjectedSales
FROM dbo.EmployeeSales;
C.Insertar los datos devueltos por una clusula OUTPUT
En el ejemplo siguiente se capturan los datos devueltos por la clusula OUTPUT de una instruccin MERGE y se
insertan en otra tabla. La instruccin MERGE actualiza diariamente la columna Quantity de la
tabla ProductInventory, en funcin de los pedidos procesados en la tabla SalesOrderDetail de la base de
datos AdventureWorks2012. Tambin elimina las filas correspondientes a los productos cuyas existencias se
colocan en el valor 0. En el ejemplo se capturan las filas que se eliminan y se insertan en otra
tabla, ZeroInventory, que realiza el seguimiento de los productos sin existencias.
IF OBJECT_ID(N'Production.ZeroInventory', N'U') IS NOT NULL
DROP TABLE Production.ZeroInventory;
GO
--Create ZeroInventory table.
19

CREATE TABLE Production.ZeroInventory (DeletedProductID int, RemovedOnDate DateTime);
GO

INSERT INTO Production.ZeroInventory (DeletedProductID, RemovedOnDate)
SELECT ProductID, GETDATE()
FROM
( MERGE Production.ProductInventory AS pi
USING (SELECT ProductID, SUM(OrderQty) FROM Sales.SalesOrderDetail AS sod
JOIN Sales.SalesOrderHeader AS soh
ON sod.SalesOrderID = soh.SalesOrderID
AND soh.OrderDate = '20070401'
GROUP BY ProductID) AS src (ProductID, OrderQty)
ON (pi.ProductID = src.ProductID)
WHEN MATCHED AND pi.Quantity - src.OrderQty <= 0
THEN DELETE
WHEN MATCHED
THEN UPDATE SET pi.Quantity = pi.Quantity - src.OrderQty
OUTPUT $action, deleted.ProductID) AS Changes (Action, ProductID)
WHERE Action = 'DELETE';
IF @@ROWCOUNT = 0
PRINT 'Warning: No rows were inserted';
GO
SELECT DeletedProductID, RemovedOnDate FROM Production.ZeroInventory;

Das könnte Ihnen auch gefallen