INSERT (Transact-SQL)INSERT (Transact-SQL)

SE APLICA A: síSQL Server (a partir de 2008) síAzure SQL Database síAzure SQL Data Warehouse síAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

Agrega una o varias filas a una tabla o una vista en SQL ServerSQL Server.Adds one or more rows to a table or a view in SQL ServerSQL Server. Para obtener ejemplos, vea Ejemplos.For examples, see Examples.

Icono de vínculo de tema Convenciones de sintaxis de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxisSyntax

-- Syntax for SQL Server and Azure SQL Database  

[ 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.table_or_view_name | schema_name.table_or_view_name | table_or_view_name }  
    ( <column_definition> )  
    [ WITH (  
        [ [ , ] CHECK_CONSTRAINTS ]  
        [ [ , ] FIRE_TRIGGERS ]  
        [ [ , ] KEEP_NULLS ]  
        [ [ , ] KILOBYTES_PER_BATCH = kilobytes_per_batch ]  
        [ [ , ] ROWS_PER_BATCH = rows_per_batch ]  
        [ [ , ] ORDER ( { column [ ASC | DESC ] } [ ,...n ] ) ]  
        [ [ , ] TABLOCK ]  
    ) ]  
}  
  
[; ] <column_definition> ::=  
 column_name <data_type>  
    [ COLLATE collation_name ]  
    [ NULL | NOT NULL ]  
  
<data type> ::=   
[ type_schema_name . ] type_name   
    [ ( precision [ , scale ] | max ]  
-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse  

INSERT INTO { database_name.schema_name.table_name | schema_name.table_name | table_name }
    [ ( column_name [ ,...n ] ) ]  
    {   
      VALUES ( { NULL | expression } )  
      | SELECT <select_criteria>  
    }  
    [ OPTION ( <query_option> [ ,...n ] ) ]  
[;]  

ArgumentosArguments

WITH <common_table_expression>WITH <common_table_expression>
Especifica el conjunto de resultados con nombre temporal, denominado también expresión de tabla común, definido en el ámbito de la instrucción INSERT.Specifies the temporary named result set, also known as common table expression, defined within the scope of the INSERT statement. El conjunto de resultados se deriva de una instrucción SELECT.The result set is derived from a SELECT statement. Para más información, vea WITH common_table_expression (Transact-SQL).For more information, see WITH common_table_expression (Transact-SQL).

TOP (expression) [ PERCENT ]TOP (expression) [ PERCENT ]
Especifica el número o el porcentaje de filas aleatorias que se van a insertar.Specifies the number or percent of random rows that will be inserted. expression puede ser un número o un porcentaje de las filas.expression can be either a number or a percent of the rows. Para más información, vea TOP (Transact-SQL).For more information, see TOP (Transact-SQL).

INTOINTO
Es una palabra clave opcional que se puede utilizar entre INSERT y la tabla de destino.Is an optional keyword that can be used between INSERT and the target table.

server_nameserver_name
Se aplica a: desde SQL Server 2008SQL Server 2008 hasta SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Es el nombre del servidor vinculado en el que se encuentra la tabla o la vista.Is the name of the linked server on which the table or view is located. server_name se puede especificar como un nombre de servidor vinculado o usando la función OPENDATASOURCE.server_name can be specified as a linked server name, or by using the OPENDATASOURCE function.

Cuando server_name se especifica como un servidor vinculado, se requiere database_name y schema_name.When server_name is specified as a linked server, database_name and schema_name are required. Cuando server_name se especifica con OPENDATASOURCE, es posible que database_name y schema_name no se apliquen a todos los orígenes de datos y dependan de las capacidades del proveedor OLE DB que accede al objeto remoto.When server_name is specified with OPENDATASOURCE, database_name and schema_name may not apply to all data sources and is subject to the capabilities of the OLE DB provider that accesses the remote object.

database_namedatabase_name
Se aplica a: desde SQL Server 2008SQL Server 2008 hasta SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Es el nombre de la base de datos.Is the name of the database.

schema_nameschema_name
Es el nombre del esquema al que pertenece la tabla o la vista.Is the name of the schema to which the table or view belongs.

table_or view_nametable_or view_name
Es el nombre de la tabla o la vista que va a recibir los datos.Is the name of the table or view that is to receive the data.

Se puede usar una variable de tabla, en su ámbito, como origen de tabla en una instrucción INSERT.A table variable, within its scope, can be used as a table source in an INSERT statement.

La vista a la que hace referencia table_or_view_name debe poderse actualizar y debe hacer referencia exactamente a una tabla base de la cláusula FROM de la vista.The view referenced by table_or_view_name must be updatable and reference exactly one base table in the FROM clause of the view. Por ejemplo, la instrucción INSERT de una vista de varias tablas debe usar una column_list que solamente haga referencia a columnas de una tabla base.For example, an INSERT into a multi-table view must use a column_list that references only columns from one base table. Para más información sobre las vistas actualizables, vea CREATE VIEW (Transact-SQL).For more information about updatable views, see CREATE VIEW (Transact-SQL).

rowset_function_limitedrowset_function_limited
Se aplica a: desde SQL Server 2008SQL Server 2008 hasta SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Especifica la función OPENQUERY u OPENROWSET.Is either the OPENQUERY or OPENROWSET function. El uso de estas funciones está sujeto a las capacidades del proveedor OLE DB que tiene acceso al objeto remoto.Use of these functions is subject to the capabilities of the OLE DB provider that accesses the remote object.

WITH ( <table_hint_limited> [... n ] )WITH ( <table_hint_limited> [... n ] )
Especifica una o varias sugerencias de tabla que están permitidas en una tabla de destino.Specifies one or more table hints that are allowed for a target table. La palabra clave WITH y los paréntesis son obligatorios.The WITH keyword and the parentheses are required.

No se permiten READPAST, NOLOCK ni READUNCOMMITTED.READPAST, NOLOCK, and READUNCOMMITTED are not allowed. Para más información sobre las sugerencias de tabla, vea Sugerencias de tabla (Transact-SQL).For more information about table hints, see Table Hints (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 versión futura de SQL ServerSQL Server.The ability to specify the HOLDLOCK, SERIALIZABLE, READCOMMITTED, REPEATABLEREAD, or UPDLOCK hints on tables that are targets of INSERT statements will be removed in a future version of SQL ServerSQL Server. Estas sugerencias no influyen en el rendimiento de las instrucciones INSERT.These hints do not affect the performance of INSERT statements. Evite el uso de dichas sugerencias en los nuevos trabajos de desarrollo y piense en modificar las aplicaciones que las utilizan actualmente.Avoid using them in new development work, and plan to modify applications that currently use them.

Especificar la sugerencia TABLOCK en una tabla que es el destino de una instrucción INSERT tiene el mismo efecto que especificar la sugerencia TABLOCKX.Specifying the TABLOCK hint on a table that is the target of an INSERT statement has the same effect as specifying the TABLOCKX hint. Se realiza un bloqueo exclusivo en la tabla.An exclusive lock is taken on the table.

(column_list)(column_list)
Es una lista de una o más columnas donde se van a insertar los datos.Is a list of one or more columns in which to insert data. column_list debe ir entre paréntesis y delimitada con comas.column_list must be enclosed in parentheses and delimited by commas.

Si la columna no se incluye en column_list, el Motor de base de datosDatabase Engine debe ser capaz de proporcionar un valor basado en la definición de la columna; de lo contrario, no se puede cargar la fila.If a column is not in column_list, the Motor de base de datosDatabase Engine must be able to provide a value based on the definition of the column; otherwise, the row cannot be loaded. Motor de base de datosDatabase Engine proporciona automáticamente un valor para la columna si esta:The Motor de base de datosDatabase Engine automatically provides a value for the column if the column:

  • Tiene una propiedad IDENTITY.Has an IDENTITY property. Se usa el valor de identidad incremental siguiente.The next incremental identity value is used.

  • Tiene un valor predeterminado.Has a default. Se usa el valor predeterminado de la columna.The default value for the column is used.

  • Tiene un tipo de datos timestamp.Has a timestamp data type. Se utiliza el valor actual de marca de tiempo.The current timestamp value is used.

  • Acepta valores NULL.Is nullable. Se usa un valor NULL.A null value is used.

  • Es una columna calculada.Is a computed column. Se utiliza el valor calculado.The calculated value is used.

column_list se debe usar al insertar valores explícitos en una columna de identidad. La opción SET IDENTITY_INSERT debe ser ON para la tabla.column_list must be used when explicit values are inserted into an identity column, and the SET IDENTITY_INSERT option must be ON for the table.

Cláusula OUTPUTOUTPUT Clause
Devuelve las filas insertadas como parte de la operación de inserción.Returns inserted rows as part of the insert operation. Los resultados se pueden devolver a la aplicación de procesamiento o insertarse en una tabla o variable de tabla para su nuevo procesamiento.The results can be returned to the processing application or inserted into a table or table variable for further processing.

La cláusula 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.The OUTPUT clause is not supported in DML statements that reference local partitioned views, distributed partitioned views, or remote tables, or INSERT statements that contain an execute_statement. La cláusula OUTPUT INTO no se admite en instrucciones INSERT que contengan una cláusula <dml_table_source>.The OUTPUT INTO clause is not supported in INSERT statements that contain a <dml_table_source> clause.

VALUESVALUES
Presenta la lista o listas de valores de datos que se van a insertar.Introduces the list or lists of data values to be inserted. Debe haber un valor de datos por cada columna en column_list, si se especifica, o en la tabla.There must be one data value for each column in column_list, if specified, or in the table. La lista de valores debe ir entre paréntesis.The value list must be enclosed in parentheses.

Si los valores de la lista Value no están 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 explícita la columna que almacenará cada valor de entrada.If the values in the Value list are not in the same order as the columns in the table or do not have a value for each column in the table, column_list must be used to explicitly specify the column that stores each incoming value.

Puede utilizar el constructor de filas de Transact-SQLTransact-SQL (que también se denomina constructor con valores de tabla) para especificar varias filas en una única instrucción INSERT.You can use the Transact-SQLTransact-SQL row constructor (also called a table value constructor) to specify multiple rows in a single INSERT statement. El constructor de filas se compone de una única cláusula VALUES con varias listas de valores escritos entre paréntesis y separados por una coma.The row constructor consists of a single VALUES clause with multiple value lists enclosed in parentheses and separated by a comma. Para más información, vea Constructor con valores de tabla (Transact-SQL).For more information, see Table Value Constructor (Transact-SQL).

DEFAULTDEFAULT
Hace que Motor de base de datosDatabase Engine cargue el valor predeterminado definido para una columna.Forces the Motor de base de datosDatabase Engine to load the default value defined for a column. Si no existe ningún valor predeterminado para la columna y esta admite valores NULL, se inserta NULL.If a default does not exist for the column and the column allows null values, NULL is inserted. En una columna definida con el tipo de datos timestamp, se inserta el siguiente valor de marca de tiempo.For a column defined with the timestamp data type, the next timestamp value is inserted. DEFAULT no es un valor válido para una columna de identidad.DEFAULT is not valid for an identity column.

expressionexpression
Es una constante, variable o expresión.Is a constant, a variable, or an expression. La expresión no puede contener una instrucción EXECUTE.The expression cannot contain an EXECUTE statement.

Cuando se hace referencia a los tipos de datos de caracteres Unicode nchar, nvarchar y ntext, debe agregarse como prefijo la letra mayúscula "N" a "expression".When referencing the Unicode character data types nchar, nvarchar, and ntext, 'expression' should be prefixed with the capital letter 'N'. Si no se especifica 'N', SQL ServerSQL Server convierte la cadena a la página de códigos que se corresponde con la intercalación predeterminada de la base de datos o columna.If 'N' is not specified, SQL ServerSQL Server converts the string to the code page that corresponds to the default collation of the database or column. Los caracteres que no se encuentren en esta página de códigos se perderán.Any characters not found in this code page are lost.

derived_tablederived_table
Es cualquier instrucción SELECT válida que devuelva filas con los datos que se van a cargar en la tabla.Is any valid SELECT statement that returns rows of data to be loaded into the table. La instrucción SELECT no puede contener una expresión de tabla común (CTE).The SELECT statement cannot contain a common table expression (CTE).

execute_statementexecute_statement
Es cualquier instrucción EXECUTE válida que devuelva datos con instrucciones SELECT o READTEXT.Is any valid EXECUTE statement that returns data with SELECT or READTEXT statements. Para obtener más información, vea EXECUTE (Transact-SQL).For more information, see EXECUTE (Transact-SQL).

Las opciones de RESULT SETS de la instrucción EXECUTE no se pueden especificar en una instrucción INSERT…EXEC.The RESULT SETS options of the EXECUTE statement cannot be specified in an INSERT...EXEC statement.

Si se usa execute_statement con INSERT, cada conjunto de resultados debe ser compatible con las columnas de la tabla o de column_list.If execute_statement is used with INSERT, each result set must be compatible with the columns in the table or in column_list.

execute_statement se puede usar para ejecutar procedimientos almacenados en el mismo servidor o en un servidor remoto.execute_statement can be used to execute stored procedures on the same server or a remote server. 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.The procedure in the remote server is executed, and the result sets are returned to the local server and loaded into the table in the local server. En una transacción distribuida, execute_statement no se puede emitir en un servidor vinculado de bucle invertido cuando la conexión tiene varios conjuntos de resultados activos múltiples (MARS) habilitados.In a distributed transaction, execute_statement cannot be issued against a loopback linked server when the connection has multiple active result sets (MARS) enabled.

If execute_statement devuelve datos con la instrucción READTEXT, cada instrucción READTEXT puede devolver un máximo de 1 MB (1024 KB) de datos.If execute_statement returns data with the READTEXT statement, each READTEXT statement can return a maximum of 1 MB (1024 KB) of data. execute_statement también se puede usar con procedimientos extendidos.execute_statement can also be used with extended procedures. 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.execute_statement inserts the data returned by the main thread of the extended procedure; however, output from threads other than the main thread are not inserted.

No puede especificar un parámetro con valores de tabla como el destino de una instrucción INSERT EXEC; sin embargo, se puede especificar como un origen en la cadena o procedimiento almacenado INSERT EXEC.You cannot specify a table-valued parameter as the target of an INSERT EXEC statement; however, it can be specified as a source in the INSERT EXEC string or stored-procedure. Para obtener más información, veaUsar parámetros con valores de tabla (motor de base de datos).For more information, see Use Table-Valued Parameters (Database Engine).

<dml_table_source><dml_table_source>
Especifica que las filas insertadas en la tabla de destino son las que ha devuelto la cláusula OUTPUT de una instrucción INSERT, UPDATE, DELETE o MERGE, filtradas opcionalmente por una cláusula WHERE.Specifies that the rows inserted into the target table are those returned by the OUTPUT clause of an INSERT, UPDATE, DELETE, or MERGE statement, optionally filtered by a WHERE clause. Si se especifica <dml_table_source>, el destino de la instrucción INSERT externa debe cumplir las siguientes restricciones:If <dml_table_source> is specified, the target of the outer INSERT statement must meet the following restrictions:

  • Debe ser una tabla base, no una vista.It must be a base table, not a view.

  • No puede ser una tabla remota.It cannot be a remote table.

  • No puede tener definido ningún desencadenador.It cannot have any triggers defined on it.

  • No puede participar en ninguna relación clave principal-clave externa.It cannot participate in any primary key-foreign key relationships.

  • No puede participar en la replicación de mezcla ni en las suscripciones actualizables para la replicación transaccional.It cannot participate in merge replication or updatable subscriptions for transactional replication.

El nivel de compatibilidad de la base de datos debe estar establecido en 100 o superior.The compatibility level of the database must be set to 100 or higher. Para más información, vea Cláusula OUTPUT (Transact-SQL).For more information, see OUTPUT Clause (Transact-SQL).

<select_list><select_list>
Es una lista separada por comas que especifica las columnas devueltas por la cláusula OUTPUT que se tienen que insertar.Is a comma-separated list specifying which columns returned by the OUTPUT clause to insert. Las columnas de <select_list> deben ser compatibles con las columnas en las que se insertan los valores.The columns in <select_list> must be compatible with the columns into which values are being inserted. <select_list> no puede hacer referencia a funciones de agregado ni a TEXTPTR.<select_list> cannot reference aggregate functions or TEXTPTR.

Nota

Las variables enumeradas en la lista SELECT hacen referencia a sus valores originales, sin tener en cuenta los cambios realizados en ellos en <dml_statement_with_output_clause>.Any variables listed in the SELECT list refer to their original values, regardless of any changes made to them in <dml_statement_with_output_clause>.

<dml_statement_with_output_clause><dml_statement_with_output_clause>
Es una instrucción INSERT, UPDATE, DELETE o MERGE válida que devuelve las filas afectadas en una cláusula OUTPUT.Is a valid INSERT, UPDATE, DELETE, or MERGE statement that returns affected rows in an OUTPUT clause. La instrucción no puede contener una cláusula WITH y no puede tener como destino tablas remotas o vistas con particiones.The statement cannot contain a WITH clause, and cannot target remote tables or partitioned views. Si se especifica UPDATE o DELETE, no puede ser una instrucción UPDATE o DELETE basada en cursores.If UPDATE or DELETE is specified, it cannot be a cursor-based UPDATE or DELETE. No se puede hacer referencia a las filas de origen como instrucciones DML anidadas.Source rows cannot be referenced as nested DML statements.

WHERE <search_condition>WHERE <search_condition>
Es cualquier cláusula WHERE que contiene una condición <search_condition> válida que filtra las filas devueltas por <dml_statement_with_output_clause>.Is any WHERE clause containing a valid <search_condition> that filters the rows returned by <dml_statement_with_output_clause>. Para más información, vea Condición de búsqueda (Transact-SQL).For more information, see Search Condition (Transact-SQL). Cuando se usa 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 búsqueda de texto completo.When used in this context, <search_condition> cannot contain subqueries, scalar user-defined functions that perform data access, aggregate functions, TEXTPTR, or full-text search predicates.

DEFAULT VALUESDEFAULT VALUES
Se aplica a: desde SQL Server 2008SQL Server 2008 hasta SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Hace que la nueva fila contenga los valores predeterminados definidos para cada columna.Forces the new row to contain the default values defined for each column.

BULKBULK
Se aplica a: desde SQL Server 2008SQL Server 2008 hasta SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

La usan las herramientas externas para cargar un flujo de datos binarios.Used by external tools to upload a binary data stream. Esta opción no está diseñada para usarse con herramientas tales como SQL Server Management StudioSQL Server Management Studio, SQLCMD, OSQL ni interfaces de programación de aplicaciones de acceso a datos como SQL ServerSQL Server Native Client.This option is not intended for use with tools such as SQL Server Management StudioSQL Server Management Studio, SQLCMD, OSQL, or data access application programming interfaces such as SQL ServerSQL Server Native Client.

FIRE_TRIGGERSFIRE_TRIGGERS
Se aplica a: desde SQL Server 2008SQL Server 2008 hasta SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Especifica que se ejecutarán todos los desencadenadores de inserción definidos en la tabla de destino durante la operación de carga de flujos de datos binarios.Specifies that any insert triggers defined on the destination table execute during the binary data stream upload operation. Para obtener más información, vea BULK INSERT (Transact-SQL).For more information, see BULK INSERT (Transact-SQL).

CHECK_CONSTRAINTSCHECK_CONSTRAINTS
Se aplica a: desde SQL Server 2008SQL Server 2008 hasta SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Especifica que deben comprobarse todas las restricciones de la tabla o vista de destino durante la operación de carga de flujos de datos binarios.Specifies that all constraints on the target table or view must be checked during the binary data stream upload operation. Para obtener más información, vea BULK INSERT (Transact-SQL).For more information, see BULK INSERT (Transact-SQL).

KEEPNULLSKEEPNULLS
Se aplica a: desde SQL Server 2008SQL Server 2008 hasta SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Especifica que las columnas vacías deben conservar un valor nulo durante la operación de carga de flujos de datos binarios.Specifies that empty columns should retain a null value during the binary data stream upload operation. Para obtener más información, vea Mantener valores NULL o usar valores predeterminados durante la importación en bloque (SQL Server).For more information, see Keep Nulls or Use Default Values During Bulk Import (SQL Server).

KILOBYTES_PER_BATCH = kilobytes_per_batchKILOBYTES_PER_BATCH = kilobytes_per_batch
Especifica el número aproximado de kilobytes (KB) de datos por lote como kilobytes_per_batch.Specifies the approximate number of kilobytes (KB) of data per batch as kilobytes_per_batch. Para obtener más información, vea BULK INSERT (Transact-SQL).For more information, see BULK INSERT (Transact-SQL).

ROWS_PER_BATCH =rows_per_batchROWS_PER_BATCH =rows_per_batch
Se aplica a: desde SQL Server 2008SQL Server 2008 hasta SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Indica el número aproximado de filas de datos del flujo de datos binarios.Indicates the approximate number of rows of data in the binary data stream. Para obtener más información, vea BULK INSERT (Transact-SQL).For more information, see BULK INSERT (Transact-SQL).

Nota

Si no se proporciona una lista de columnas, se produce un error de sintaxis.A syntax error is raised if a column list is not provided.

NotasRemarks

Para obtener información específica sobre cómo insertar datos en tablas de SQL Graph, vea INSERT (SQL Graph).For information specific to inserting data into SQL graph tables, see INSERT (SQL Graph).

Procedimientos recomendadosBest Practices

Use la función @@ROWCOUNT para devolver el número de filas insertadas a la aplicación cliente.Use the @@ROWCOUNT function to return the number of inserted rows to the client application. Para más información, vea @@ROWCOUNT (Transact-SQL).For more information, see @@ROWCOUNT (Transact-SQL).

Prácticas recomendadas para la importación masiva de datosBest Practices for Bulk Importing Data

Usar INSERT INTO…SELECT para realizar una importación masiva de datos con registro mínimoUsing INSERT INTO...SELECT to Bulk Import Data with Minimal Logging

Puede usar INSERT INTO <target_table> SELECT <columns> FROM <source_table> para transferir eficazmente un gran número de filas de una tabla, como una tabla de ensayo, a otra tabla con registro mínimo.You can use INSERT INTO <target_table> SELECT <columns> FROM <source_table> to efficiently transfer a large number of rows from one table, such as a staging table, to another table with minimal logging. El registro mínimo puede mejorar el rendimiento de la instrucción y reducir la posibilidad de que la operación rellene el espacio del registro de transacciones disponible durante la transacción.Minimal logging can improve the performance of the statement and reduce the possibility of the operation filling the available transaction log space during the transaction.

El registro mínimo para esta instrucción tiene los requisitos siguientes:Minimal logging for this statement has the following requirements:

  • El modelo de recuperación de la base de datos está establecido en registro simple o masivo.The recovery model of the database is set to simple or bulk-logged.

  • La tabla de destino es un montón vacío o no vacío.The target table is an empty or nonempty heap.

  • La tabla de destino no se usa en la replicación.The target table is not used in replication.

  • La sugerencia TABLOCK se especifica para la tabla de destino.The TABLOCK hint is specified for the target table.

Las filas que se insertan en un montón como el resultado de una acción de inserción en una instrucción MERGE también se pueden registrar con un nivel mínimo.Rows that are inserted into a heap as the result of an insert action in a MERGE statement may also be minimally logged.

A diferencia de la instrucción BULK INSERT, que contiene un bloqueo Bulk Update menos restrictivo, INSERT INTO…SELECT con la sugerencia TABLOCK retiene un bloqueo exclusivo (X) en la tabla.Unlike the BULK INSERT statement, which holds a less restrictive Bulk Update lock, INSERT INTO...SELECT with the TABLOCK hint holds an exclusive (X) lock on the table. Esto significa que no se pueden insertar filas mediante operaciones de inserción en paralelo.This means that you cannot insert rows using parallel insert operations.

Usar OPENROWSET y BULK para datos de importación masivaUsing OPENROWSET and BULK to Bulk Import Data

La función OPENROWSET puede aceptar las siguientes sugerencias de tabla, que proporcionan optimizaciones de carga masiva con la instrucción INSERT:The OPENROWSET function can accept the following table hints, which provide bulk-load optimizations with the INSERT statement:

  • La sugerencia TABLOCK puede reducir al mínimo el número de registros para la operación de inserción.The TABLOCK hint can minimize the number of log records for the insert operation. El modelo de recuperación de la base de datos debe establecerse en registro simple o masivo, y la tabla de destino no se puede utilizar en la replicación.The recovery model of the database must be set to simple or bulk-logged and the target table cannot be used in replication. Para más información, vea Requisitos previos para el registro mínimo durante la importación en bloque.For more information, see Prerequisites for Minimal Logging in Bulk Import.

  • La sugerencia IGNORE_CONSTRAINTS puede deshabilitar temporalmente la comprobación de restricciones FOREIGN KEY y CHECK.The IGNORE_CONSTRAINTS hint can temporarily disable FOREIGN KEY and CHECK constraint checking.

  • La sugerencia IGNORE_TRIGGERS puede deshabilitar temporalmente la ejecución de desencadenadores.The IGNORE_TRIGGERS hint can temporarily disable trigger execution.

  • La sugerencia KEEPDEFAULTS permite la inserción 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.The KEEPDEFAULTS hint allows the insertion of a table column's default value, if any, instead of NULL when the data record lacks a value for the column.

  • 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.The KEEPIDENTITY hint allows the identity values in the imported data file to be used for the identity column in the target table.

Estas optimizaciones son similares a las que están disponibles con el comando BULK INSERT.These optimizations are similar to those available with the BULK INSERT command. Para obtener más información, vea Sugerencias de tabla (Transact-SQL).For more information, see Table Hints (Transact-SQL).

Tipos de datosData Types

Al insertar filas, considere el comportamiento de los tipos de datos siguientes:When you insert rows, consider the following data type behavior:

  • 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, ceros para varbinary) se determinan a partir del valor de la opción SET ANSI_PADDING definida para la columna al crear la tabla.If a value is being loaded into columns with a char, varchar, or varbinary data type, the padding or truncation of trailing blanks (spaces for char and varchar, zeros for varbinary) is determined by the SET ANSI_PADDING setting defined for the column when the table was created. Para obtener más información, vea SET ANSI_PADDING (Transact-SQL).For more information, see SET ANSI_PADDING (Transact-SQL).

    En la siguiente tabla se muestra la operación predeterminada cuando SET ANSI_PADDING es OFF.The following table shows the default operation for SET ANSI_PADDING OFF.

    Tipo de datosData type Operación predeterminadaDefault operation
    charchar Rellena el valor con espacios hasta el ancho definido de la columna.Pad value with spaces to the defined width of column.
    varcharvarchar Quita los espacios finales hasta el último carácter distinto de espacio o hasta un carácter de espacio único para las cadenas compuestas solamente de espacios.Remove trailing spaces to the last non-space character or to a single-space character for strings made up of only spaces.
    varbinaryvarbinary Quita los ceros finales.Remove trailing zeros.
  • Si se carga una cadena vacía (' ') en una columna con un tipo de datos varchar o text, la operación predeterminada consiste en cargar una cadena de longitud cero.If an empty string (' ') is loaded into a column with a varchar or text data type, the default operation is to load a zero-length string.

  • Al insertar un valor NULL en una columna text o image, no se crea un puntero de texto válido ni se asigna previamente una página de texto de 8 KB.Inserting a null value into a text or image column does not create a valid text pointer, nor does it preallocate an 8-KB text page.

  • En las columnas creadas con el tipo de datos uniqueidentifier se almacenan valores binarios de 16 bytes con formato especial.Columns created with the uniqueidentifier data type store specially formatted 16-byte binary values. A diferencia de las columnas de identidad, el Motor de base de datosDatabase Engine no genera automáticamente valores de columnas con el tipo de datos uniqueidentifier.Unlike with identity columns, the Motor de base de datosDatabase Engine does not automatically generate values for columns with the uniqueidentifier data type. Durante una operación de inserción, 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 dígito hexadecimal de los intervalos 0-9 o a-f) de las columnas uniqueidentifier.During an insert operation, variables with a data type of uniqueidentifier and string constants in the form xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (36 characters including hyphens, where x is a hexadecimal digit in the range 0-9 or a-f) can be used for uniqueidentifier columns. Por ejemplo, 6F9619FF-8B86-D011-B42D-00C04FC964FF es un valor válido de una columna o variable uniqueidentifier.For example, 6F9619FF-8B86-D011-B42D-00C04FC964FF is a valid value for a uniqueidentifier variable or column. Use la función NEWID() para obtener un identificador único global (GUID).Use the NEWID() function to obtain a globally unique ID (GUID).

Insertar valores en columnas de tipo definido por el usuarioInserting Values into User-Defined Type Columns

Puede insertar valores en columnas de tipo definido por el usuario si:You can insert values in user-defined type columns by:

  • Proporciona un valor del tipo definido por el usuario.Supplying a value of the user-defined type.

  • Suministrar un valor de un tipo de datos del sistema de SQL ServerSQL Server, siempre y cuando el tipo definido por el usuario admita la conversión implícita o explícita desde ese tipo.Supplying a value in a SQL ServerSQL Server system data type, as long as the user-defined type supports implicit or explicit conversion from that type. En el siguiente ejemplo se muestra cómo insertar un valor en una columna de tipo definido por el usuarioPoint por medio de la conversión explícita a partir de una cadena.The following example shows how to insert a value in a column of user-defined type Point, by explicitly converting from a string.

    INSERT INTO Cities (Location)  
    VALUES ( CONVERT(Point, '12.3:46.2') );  
    

    También se puede suministrar un valor binario sin realizar ninguna conversión explícita, dado que todos los tipos definidos por el usuario se pueden convertir implícitamente a partir de este valor binario.A binary value can also be supplied without performing explicit conversion, because all user-defined types are implicitly convertible from binary.

  • Llama a una función definida por el usuario que devuelve un valor del tipo definido por el usuario.Calling a user-defined function that returns a value of the user-defined type. En el siguiente ejemplo se utiliza una función CreateNewPoint() definida por el usuario para crear un valor nuevo del tipo Point definido por el usuario e insertar el valor en la tabla Cities.The following example uses a user-defined function CreateNewPoint() to create a new value of user-defined type Point and insert the value into the Cities table.

    INSERT INTO Cities (Location)  
    VALUES ( dbo.CreateNewPoint(x, y) );  
    

Tratamiento de erroresError Handling

Puede implementar el tratamiento de errores para la instrucción INSERT especificando la instrucción en una construcción TRY…CATCH.You can implement error handling for the INSERT statement by specifying the statement in a TRY...CATCH construct.

Si una instrucción INSERT infringe una restricción o una regla, o si contiene un valor incompatible con el tipo de datos de la columna, la instrucción no se puede ejecutar y se recibe un mensaje de error.If an INSERT statement violates a constraint or rule, or if it has a value incompatible with the data type of the column, the statement fails and an error message is returned.

Si INSERT carga varias filas con SELECT o EXECUTE, cualquier infracción de una regla o restricción que se produzca en los valores que se cargan provoca que se detenga la instrucción y que no se carguen filas.If INSERT is loading multiple rows with SELECT or EXECUTE, any violation of a rule or constraint that occurs from the values being loaded causes the statement to be stopped, and no rows are loaded.

Cuando una instrucción INSERT detecta un error aritmético (desbordamiento, división entre cero o error de dominio) al evaluar una expresión, Motor de base de datosDatabase Engine trata dichos errores como si SET ARITHABORT estuviera establecido en ON.When an INSERT statement encounters an arithmetic error (overflow, divide by zero, or a domain error) occurring during expression evaluation, the Motor de base de datosDatabase Engine handles these errors as if SET ARITHABORT is set to ON. El lote se detiene y se devuelve un mensaje de error.The batch is stopped, and an error message is returned. Al evaluar una expresión con SET ARITHABORT y SET ANSI_WARNINGS en OFF, si una instrucción INSERT, DELETE o UPDATE encuentra un error aritmético, desbordamiento, división entre cero o error de dominio, SQL ServerSQL Server inserta o actualiza un valor NULL.During expression evaluation when SET ARITHABORT and SET ANSI_WARNINGS are OFF, if an INSERT, DELETE or UPDATE statement encounters an arithmetic error, overflow, divide-by-zero, or a domain error, SQL ServerSQL Server inserts or updates a NULL value. Si la columna de destino no acepta valores NULL, no se puede efectuar la acción de inserción o actualización y el usuario recibe un error.If the target column is not nullable, the insert or update action fails and the user receives an error.

InteroperabilidadInteroperability

Cuando se define un desencadenador INSTEAD OF en las acciones INSERT en una tabla o vista, se ejecuta el desencadenador en lugar de la instrucción INSERT.When an INSTEAD OF trigger is defined on INSERT actions against a table or view, the trigger executes instead of the INSERT statement. Para más información sobre los desencadenadores INSTEAD OF, vea CREATE TRIGGER (Transact-SQL).For more information about INSTEAD OF triggers, see CREATE TRIGGER (Transact-SQL).

Limitaciones y restriccionesLimitations and Restrictions

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.When you insert values into remote tables and not all values for all columns are specified, you must identify the columns to which the specified values are to be inserted.

Cuando se utiliza TOP con INSERT las filas a las que hace referencia no están organizadas de ninguna manera y la cláusula ORDER BY no se puede especificar directamente en esta instrucción.When TOP is used with INSERT the referenced rows are not arranged in any order and the ORDER BY clause can not be directly specified in this statements. Si necesita usar TOP para insertar las filas en un orden cronológico significativo, debe utilizar TOP junto con una cláusula ORDER BY que se especifica en una instrucción de subselección.If you need to use TOP to insert rows in a meaningful chronological order, you must use TOP together with an ORDER BY clause that is specified in a subselect statement. Vea la sección Ejemplos que aparece más adelante en este tema.See the Examples section that follows in this topic.

Las consultas INSERT en las que se usa SELECT con ORDER BY para rellenar filas garantizan el modo en que se calculan los valores de identidad, pero no el orden en el que las filas se insertan.INSERT queries that use SELECT with ORDER BY to populate rows guarantees how identity values are computed but not the order in which the rows are inserted.

En Almacenamiento de datos paralelos, la cláusula ORDER BY no es válida en VIES, CREATE TABLE AS SELECT, INSERT SELECT, funciones insertadas, tablas derivadas, subconsultas ni expresiones de tabla común, salvo que se especifique también TOP.In Parallel Data Warehouse, the ORDER BY clause is invalid in VIEWS, CREATE TABLE AS SELECT, INSERT SELECT, inline functions, derived tables, subqueries and common table expressions, unless TOP is also specified.

Comportamiento del registroLogging Behavior

La instrucción INSERT siempre se registra completamente excepto cuando se usa la función OPENROWSET con la palabra clave BULK o cuando se usa INSERT INTO <target_table> SELECT <columns> FROM <source_table>.The INSERT statement is always fully logged except when using the OPENROWSET function with the BULK keyword or when using INSERT INTO <target_table> SELECT <columns> FROM <source_table>. Estas operaciones pueden ser registradas mínimamente.These operations can be minimally logged. Para obtener más información, vea la sección "Prácticas recomendadas para la carga masiva de datos" anteriormente en este tema.For more information, see the section "Best Practices for Bulk Loading Data" earlier in this topic.

SeguridadSecurity

Durante una conexión de servidores vinculados, el servidor de envío proporciona un nombre de inicio de sesión y una contraseña para conectarse en su nombre al servidor de recepción.During a linked server connection, the sending server provides a login name and password to connect to the receiving server on its behalf. Para que esta conexión funcione, debe crear una asignación de inicio de sesión entre los servidores vinculados usando sp_addlinkedsrvlogin.For this connection to work, you must create a login mapping between the linked servers by using sp_addlinkedsrvlogin.

Cuando utilice OPENROWSET (BULK…), es importante que entienda el modo en el que SQL ServerSQL Server controla la suplantación.When you use OPENROWSET(BULK...), it is important to understand how SQL ServerSQL Server handles impersonation. Para más información, vea "Consideraciones relativas a la seguridad" en Importación en bloque de datos mediante las instrucciones BULK INSERT u OPENROWSET(BULK...) (SQL Server).For more information, see "Security Considerations" in Import Bulk Data by Using BULK INSERT or OPENROWSET(BULK...) (SQL Server).

PermisosPermissions

El permiso INSERT es obligatorio en la tabla de destino.INSERT permission is required on the target table.

Los permisos INSERT corresponden de forma predeterminada a los miembros del rol fijo de servidor sysadmin, de los roles fijos de base de datos db_owner y db_datawriter y al propietario de la tabla.INSERT permissions default to members of the sysadmin fixed server role, the db_owner and db_datawriter fixed database roles, and the table owner. Los miembros de los roles sysadmin, db_owner y db_securityadmin y el propietario de la tabla pueden transferir permisos a otros usuarios.Members of the sysadmin, db_owner, and the db_securityadmin roles, and the table owner can transfer permissions to other users.

Para ejecutar INSERT con la opción BULK de la función OPENROWSET, debe ser miembro de los roles fijos de servidor sysadmin o bulkadmin.To execute INSERT with the OPENROWSET function BULK option, you must be a member of the sysadmin fixed server role or of the bulkadmin fixed server role.

EjemplosExamples

CategoríaCategory Elementos de sintaxis ofrecidosFeatured syntax elements
Sintaxis básicaBasic syntax INSERT • constructor con valores de tablaINSERT • table value constructor
Tratar los valores de columnaHandling column values IDENTITY • NEWID • valores predeterminados • tipos definidos por el usuarioIDENTITY • NEWID • default values • user-defined types
Insertar datos de otras tablasInserting data from other tables INSERT…SELECT • INSERT…EXECUTE • WITH expresión de tabla común • TOP • OFFSET FETCHINSERT...SELECT • INSERT...EXECUTE • WITH common table expression • TOP • OFFSET FETCH
Especificar objetos de destino que no sean tablas estándarSpecifying target objects other than standard tables Vistas • variables de tablaViews • table variables
Insertar filas en una tabla remotaInserting rows into a remote table Servidor vinculado • función de conjunto de filas OPENQUERY • función de conjunto de filas OPENDATASOURCELinked server • OPENQUERY rowset function • OPENDATASOURCE rowset function
Cargar datos de forma masiva de tablas o archivos de datosBulk loading data from tables or data files INSERT…SELECT • función OPENROWSETINSERT...SELECT • OPENROWSET function
Invalidar el comportamiento predeterminado del optimizador de consultas mediante sugerenciasOverriding the default behavior of the query optimizer by using hints Sugerencias de tablaTable hints
Capturar los resultados de la instrucción INSERTCapturing the results of the INSERT statement Cláusula OUTPUTOUTPUT clause

Sintaxis básicaBasic Syntax

Los ejemplos de esta sección demuestran la funcionalidad básica de la instrucción INSERT usando la sintaxis mínima requerida.Examples in this section demonstrate the basic functionality of the INSERT statement using the minimum required syntax.

A.A. Insertar una sola fila de datosInserting a single row of data

En el siguiente ejemplo se inserta una fila en la tabla Production.UnitMeasure en la base de datos AdventureWorks2012AdventureWorks2012.The following example inserts one row into the Production.UnitMeasure table in the AdventureWorks2012AdventureWorks2012 database. Las columnas de esta tabla son UnitMeasureCode, Name y ModifiedDate.The columns in this table are UnitMeasureCode, Name, and 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 .Because values for all columns are supplied and are listed in the same order as the columns in the table, the column names do not have to be specified in the column list .

INSERT INTO Production.UnitMeasure  
VALUES (N'FT', N'Feet', '20080414');  

B.B. Insertar varias filas de datosInserting multiple rows of data

En el siguiente ejemplo se usa el constructor de valores de tabla para insertar tres filas en la tabla Production.UnitMeasure de la base de datos AdventureWorks2012AdventureWorks2012 en una sola instrucción INSERT.The following example uses the table value constructor to insert three rows into the Production.UnitMeasure table in the AdventureWorks2012AdventureWorks2012 database in a single INSERT statement. 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.Because values for all columns are supplied and are listed in the same order as the columns in the table, the column names do not have to be specified in the column list.

INSERT INTO Production.UnitMeasure  
VALUES (N'FT2', N'Square Feet ', '20080923'), (N'Y', N'Yards', '20080923')
    , (N'Y3', N'Cubic Yards', '20080923');  

C.C. Insertar datos que no están en el mismo orden que las columnas de la tablaInserting data that is not in the same order as the table columns

En el siguiente ejemplo se utiliza una lista de columnas para especificar de forma explícita los valores insertados en cada columna.The following example uses a column list to explicitly specify the values that are inserted into each column. El orden de las columnas de la tabla Production.UnitMeasure en la base de datos AdventureWorks2012AdventureWorks2012 es, UnitMeasureCode, Name, ModifiedDate; no obstante, las columnas no se incluyen en dicho orden en column_list.The column order in the Production.UnitMeasure table in the AdventureWorks2012AdventureWorks2012 database is UnitMeasureCode, Name, ModifiedDate; however, the columns are not listed in that order in column_list.

INSERT INTO Production.UnitMeasure (Name, UnitMeasureCode,  
    ModifiedDate)  
VALUES (N'Square Yards', N'Y2', GETDATE());  

Tratar los valores de columnaHandling Column Values

Los ejemplos de esta sección muestran métodos 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.Examples in this section demonstrate methods of inserting values into columns that are defined with an IDENTITY property, DEFAULT value, or are defined with data types such as uniqueidentifer or user-defined type columns.

D.D. Insertar datos en una tabla con columnas que tienen valores predeterminadosInserting data into a table with columns that have default values

En el ejemplo siguiente se muestra la inserción de filas en una tabla con columnas que generan automáticamente un valor o tienen un valor predeterminado.The following example shows inserting rows into a table with columns that automatically generate a value or have a default value. Column_1 es una columna calculada que genera automáticamente un valor concatenando una cadena con el valor insertado en column_2.Column_1 is a computed column that automatically generates a value by concatenating a string with the value inserted into column_2. Column_2 se define con una restricción predeterminada.Column_2 is defined with a default constraint. Si no se especifica un valor para esta columna, se usará el valor predeterminado.If a value is not specified for this column, the default value is used. Column_3 se define con el tipo de datos rowversion, que genera automáticamente un número binario único que se incrementa.Column_3 is defined with the rowversion data type, which automatically generates a unique, incrementing binary number. Column_4 no genera automáticamente ningún valor.Column_4 does not automatically generate a value. Cuando no se especifica un valor para esta columna, se inserta NULL.When a value for this column is not specified, NULL is inserted. La instrucción INSERT inserta filas que contienen valores para algunas de las columnas, pero no para todas.The INSERT statements insert rows that contain values for some of the columns but not all. En la última instrucción INSERT, no se especifica ninguna columna y solamente se insertan los valores predeterminados con la cláusula DEFAULT VALUES.In the last INSERT statement, no columns are specified and only the default values are inserted by using the DEFAULT VALUES clause.

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  

E.E. Insertar datos en una tabla con una columna de identidadInserting data into a table with an identity column

En el siguiente ejemplo se muestran los distintos métodos para insertar datos en una columna de identidad.The following example shows different methods of inserting data into an identity column. Las dos primeras instrucciones INSERT permiten generar valores de identidad para las filas nuevas.The first two INSERT statements allow identity values to be generated for the new rows. La tercera instrucción INSERT invalida la propiedad IDENTITY de la columna con la instrucción SET IDENTITY_INSERT e inserta un valor explícito en la columna de identidad.The third INSERT statement overrides the IDENTITY property for the column with the SET IDENTITY_INSERT statement and inserts an explicit value into the identity column.

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  

F.F. Insertar datos en una columna uniqueidentifier mediante NEWID()Inserting data into a uniqueidentifier column by using NEWID()

En el siguiente ejemplo se usa la función NEWID() para obtener un GUID para column_2.The following example uses the NEWID() function to obtain a GUID for column_2. A diferencia de las columnas de identidad, el Motor de base de datosDatabase Engine no genera automáticamente valores de columnas con el tipo de datos uniqueidentifier, según se muestra en la segunda instrucción INSERT.Unlike for identity columns, the Motor de base de datosDatabase Engine does not automatically generate values for columns with the uniqueidentifier data type, as shown by the second INSERT statement.

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;  
  

G.G. Insertar datos en columnas de tipo definido por el usuarioInserting data into user-defined type columns

Las siguientes instrucciones de Transact-SQLTransact-SQL insertan tres filas en la columna PointValue de la tabla Points.The following Transact-SQLTransact-SQL statements insert three rows into the PointValue column of the Points table. Esta columna usa un tipo definido por el usuario CLR (UDT).This column uses a CLR user-defined type (UDT). El tipo de datos Point está compuesto por valores enteros X e Y que se exponen como propiedades del UDT.The Point data type consists of X and Y integer values that are exposed as properties of the UDT. Debe utilizar las funciones CAST o CONVERT para convertir los valores X e Y separados por comas al tipo Point.You must use either the CAST or CONVERT function to cast the comma-delimited X and Y values to the Point type. Las dos primeras instrucciones usan la función CONVERT para convertir un valor de cadena al tipo Point y la tercera usa la función CAST.The first two statements use the CONVERT function to convert a string value to the Point type, and the third statement uses the CAST function. Para más información, vea Manipulating UDT Data (Manipular datos de UDT).For more information, see Manipulating UDT Data.

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 tablasInserting Data from Other Tables

Los ejemplos de esta sección demuestran métodos para insertar filas de una tabla en otra.Examples in this section demonstrate methods of inserting rows from one table into another table.

H.H. Usar las opciones SELECT y EXECUTE para insertar datos de otras tablasUsing the SELECT and EXECUTE options to insert data from other tables

En el siguiente ejemplo se muestra cómo insertar datos de una tabla en otra mediante INSERT…SELECT o INSERT…EXECUTE.The following example shows how to insert data from one table into another table by using INSERT...SELECT or INSERT...EXECUTE. Cada uno se basa en una instrucción SELECT con varias tablas que contiene una expresión y un valor literal en la lista de columnas.Each is based on a multi-table SELECT statement that includes an expression and a literal value in the column list.

La primera instrucción INSERT usa una instrucción SELECT para derivar los datos de las tablas de origen (Employee, SalesPerson y Person) en la base de datos AdventureWorks2012AdventureWorks2012 y almacenar el conjunto de resultados en la tabla EmployeeSales.The first INSERT statement uses a SELECT statement to derive the data from the source tables (Employee, SalesPerson, and Person) in the AdventureWorks2012AdventureWorks2012 database and store the result set in the EmployeeSales table. La segunda instrucción INSERT usa la cláusula EXECUTE para llamar a un procedimiento almacenado que contiene la instrucción SELECT y la tercera instrucción INSERT usa la cláusula EXECUTE para hacer referencia a la instrucción SELECT como una cadena literal.The second INSERT statement uses the EXECUTE clause to call a stored procedure that contains the SELECT statement, and the third INSERT uses the EXECUTE clause to reference the SELECT statement as a literal string.

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

I.I. Usar la expresión de tabla común WITH para definir los datos insertadosUsing WITH common table expression to define the data inserted

En el siguiente ejemplo se crea la tabla NewEmployee en la base de datos AdventureWorks2012AdventureWorks2012.The following example creates the NewEmployee table in the AdventureWorks2012AdventureWorks2012 database. Una expresión de tabla común (EmployeeTemp) define las filas de una o varias tablas que se van a insertar en la tabla NewEmployee.A common table expression (EmployeeTemp) defines the rows from one or more tables to be inserted into the NewEmployee table. La instrucción INSERT hace referencia a las columnas de la expresión de tabla común.The INSERT statement references the columns in the common table expression.

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

J.J. Usar TOP para limitar los datos insertados de la tabla de origenUsing TOP to limit the data inserted from the source table

En el siguiente ejemplo se crea la tabla EmployeeSales y se insertan el nombre y los datos de ventas del año hasta la fecha para los primeros 5 empleados aleatorios de la tabla HumanResources.Employee en la base de datos AdventureWorks2012AdventureWorks2012.The following example creates the table EmployeeSales and inserts the name and year-to-date sales data for the top 5 random employees from the table HumanResources.Employee in the AdventureWorks2012AdventureWorks2012 database. La instrucción INSERT elige cualquiera de las 5 filas devueltas por la instrucción SELECT.The INSERT statement chooses any 5 rows returned by the SELECT statement. La cláusula OUTPUT muestra las filas que se insertan en la tabla EmployeeSales.The OUTPUT clause displays the rows that are inserted into the EmployeeSales table. Observe que la cláusula ORDER BY de la instrucción SELECT no se utiliza para determinar los primeros 5 empleados.Notice that the ORDER BY clause in the SELECT statement is not used to determine the top 5 employees.

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 cronológico significativo, debe utilizar TOP junto con ORDER BY en una instrucción de subselección, tal y como se muestra en el siguiente ejemplo.If you have to use TOP to insert rows in a meaningful chronological order, you must use TOP together with ORDER BY in a subselect statement as shown in the following example. La cláusula OUTPUT muestra las filas que se insertan en la tabla EmployeeSales.The OUTPUT clause displays the rows that are inserted into the EmployeeSales table. Observe que los primeros 5 empleados se insertan ahora según los resultados de la cláusula ORDER BY en lugar de las filas aleatorias.Notice that the top 5 employees are now inserted based on the results of the ORDER BY clause instead of random rows.

INSERT INTO dbo.EmployeeSales  
    OUTPUT inserted.EmployeeID, inserted.FirstName, 
        inserted.LastName, inserted.YearlySales  
    SELECT TOP (5) sp.BusinessEntityID, c.LastName, c.FirstName, sp.SalesYTD   
    FROM Sales.SalesPerson AS sp  
    INNER JOIN Person.Person AS c  
        ON sp.BusinessEntityID = c.BusinessEntityID  
    WHERE sp.SalesYTD > 250000.00  
    ORDER BY sp.SalesYTD DESC;  

Especificar objetos de destino que no sean tablas estándarSpecifying Target Objects Other Than Standard Tables

En los ejemplos de esta sección se muestra cómo insertar filas especificando una variable de tabla o vista.Examples in this section demonstrate how to insert rows by specifying a view or table variable.

K.K. Insertar datos especificando una vistaInserting data by specifying a view

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.The following example specifies a view name as the target object; however, the new row is inserted in the underlying base table. El orden de los valores de la instrucción INSERT debe coincidir con el orden de las columnas de la vista.The order of the values in the INSERT statement must match the column order of the view. Para más información, vea Modificar datos mediante una vista.For more information, see Modify Data Through a View.

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  

L.L. Insertar datos en una variable de tablaInserting data into a table variable

En el siguiente ejemplo se especifica una variable de tabla como el objeto de destino en la base de datos AdventureWorks2012AdventureWorks2012.The following example specifies a table variable as the target object in the AdventureWorks2012AdventureWorks2012 database.

-- Create the table variable.  
DECLARE @MyTableVar table(  
    LocationID int NOT NULL,  
    CostRate smallmoney NOT NULL,  
    NewCostRate AS CostRate * 1.5,  
    ModifiedDate datetime);  
  
-- Insert values into the table variable.  
INSERT INTO @MyTableVar (LocationID, CostRate, ModifiedDate)  
    SELECT LocationID, CostRate, GETDATE() 
    FROM Production.Location  
    WHERE CostRate > 0;  
  
-- View the table variable result set.  
SELECT * FROM @MyTableVar;  
GO  

Insertar filas en una tabla remotaInserting Rows into a Remote Table

Los ejemplos de esta sección demuestran cómo insertar filas en una tabla de destino remota usando un servidor vinculado o una función de conjunto de filas para hacer referencia a la tabla remota.Examples in this section demonstrate how to insert rows into a remote target table by using a linked server or a rowset function to reference the remote table.

M.M. Insertar datos en una tabla remota mediante un servidor vinculadoInserting data into a remote table by using a linked server

El ejemplo siguiente inserta filas en una tabla remota.The following example inserts rows into a remote table. En el ejemplo primero se crea un vínculo al origen de datos remoto mediante sp_addlinkedserver.The example begins by creating a link to the remote data source by using sp_addlinkedserver. El nombre del servidor vinculado, MyLinkServer, se especifica después como parte del nombre de objeto de cuatro partes con el formato server.catalog.schema.object.The linked server name, MyLinkServer, is then specified as part of the four-part object name in the form server.catalog.schema.object.

Se aplica a: desde SQL Server 2008SQL Server 2008 hasta SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

USE master;  
GO  
-- Create a link to the remote data source.   
-- Specify a valid server name for @datasrc as 'server_name' 
-- or 'server_nameinstance_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  

N.N. Insertar datos en una tabla remota con una función OPENQUERYInserting data into a remote table by using the OPENQUERY function

En el siguiente ejemplo se inserta una fila en una tabla remota especificando la función de conjunto de filas OPENQUERY.The following example inserts a row into a remote table by specifying the OPENQUERY rowset function. En este ejemplo se usa el nombre del servidor vinculado creado en el ejemplo anterior.The linked server name created in the previous example is used in this example.

Se aplica a: desde SQL Server 2008SQL Server 2008 hasta SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

INSERT OPENQUERY (MyLinkServer, 
    'SELECT Name, GroupName 
     FROM AdventureWorks2012.HumanResources.Department')  
VALUES ('Environmental Impact', 'Engineering');  
GO  

O.O. Insertar datos en una tabla remota con una función OPENDATASOURCEInserting data into a remote table by using the OPENDATASOURCE function

En el ejemplo siguiente se inserta una fila en una tabla remota mediante la especificación de la función de conjunto de filas OPENDATASOURCE.The following example inserts a row into a remote table by specifying the OPENDATASOURCE rowset function. Especifique un nombre de servidor válido para el origen de datos con el formato server_name o server_name\instance_name.Specify a valid server name for the data source by using the format server_name or server_name\instance_name.

Se aplica a: desde SQL Server 2008SQL Server 2008 hasta SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

-- 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_nameinstance_name.  
  
INSERT INTO OPENDATASOURCE('SQLNCLI',  
    'Data Source= <server_name>; Integrated Security=SSPI')  
    .AdventureWorks2012.HumanResources.Department (Name, GroupName)  
    VALUES (N'Standards and Methods', 'Quality Assurance');  
GO  

P.P. Insertar en una tabla externa creada con PolyBaseInserting into an external table created using PolyBase

Exporte datos de SQL Server a Hadoop o Azure Storage.Export data from SQL Server to Hadoop or Azure Storage. En primer lugar, cree una tabla externa que apunte al directorio o archivo de destino.First, create an external table that points to the destination file or directory. A continuación, utilice INSERT INTO para exportar datos de una tabla de SQL Server local a un origen de datos externo.Then, use INSERT INTO to export data from a local SQL Server table to an external data source. La instrucción INSERT INTO crea el archivo o directorio de destino si no existe y los resultados de la instrucción SELECT se exportan a la ubicación especificada en el formato de archivo especificado.The INSERT INTO statement creates the destination file or directory if it does not exist and the results of the SELECT statement are exported to the specified location in the specified file format. Para obtener más información, vea Introducción a PolyBase.For more information, see Get started with PolyBase.

Se aplica a: SQL Server 2017SQL Server 2017.Applies to: SQL Server 2017SQL Server 2017.

-- Create an external table.   
CREATE EXTERNAL TABLE [dbo].[FastCustomers2009] (  
        [FirstName] char(25) NOT NULL,   
        [LastName] char(25) NOT NULL,   
        [YearlyIncome] float NULL,   
        [MaritalStatus] char(1) NOT NULL  
)  
WITH (  
        LOCATION='/old_data/2009/customerdata.tbl',  
        DATA_SOURCE = HadoopHDP2,  
        FILE_FORMAT = TextFileFormat,  
        REJECT_TYPE = VALUE,  
        REJECT_VALUE = 0  
);  
  
-- Export data: Move old data to Hadoop while keeping 
-- it query-able via external table.  

INSERT INTO dbo.FastCustomer2009  
SELECT T.* FROM Insured_Customers T1 JOIN CarSensor_Data T2  
ON (T1.CustomerKey = T2.CustomerKey)  
WHERE T2.YearMeasured = 2009 and T2.Speed > 40;  

Cargar datos de forma masiva de tablas o archivos de datosBulk Loading Data from Tables or Data Files

Los ejemplos de esta sección muestran dos métodos para cargar datos de forma masiva en una tabla mediante la instrucción INSERT.Examples in this section demonstrate two methods to bulk load data into a table by using the INSERT statement.

Q.Q. Insertar datos en un montón con registro mínimoInserting data into a heap with minimal logging

El ejemplo siguiente crea una tabla nueva (un montón) e inserta los datos en ella desde otra tabla con registro mínimo.The following example creates a new table (a heap) and inserts data from another table into it using minimal logging. El ejemplo supone que el modelo de recuperación de la base de datos AdventureWorks2012 está establecido en FULL.The example assumes that the recovery model of the AdventureWorks2012 database is set to FULL. Para asegurarse de que se utiliza el registro mínimo, el modelo de recuperación de la base de datos AdventureWorks2012 se establece en BULK_LOGGED antes de que las filas se inserten y se restablece en FULL después de la instrucción INSERT INTO…SELECT.To ensure minimal logging is used, the recovery model of the AdventureWorks2012 database is set to BULK_LOGGED before rows are inserted and reset to FULL after the INSERT INTO...SELECT statement. Además, se especifica la sugerencia TABLOCK para la tabla de destino Sales.SalesHistory.In addition, the TABLOCK hint is specified for the target table Sales.SalesHistory. Esto asegura que la instrucción use el espacio mínimo en el registro de transacciones y funcione eficazmente.This ensures that the statement uses minimal space in the transaction log and performs efficiently.

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

R.R. Usar la función OPENROWSET con BULK para cargar datos de forma masiva en una tablaUsing the OPENROWSET function with BULK to bulk load data into a table

En el ejemplo siguiente se insertan filas de un archivo de datos en una tabla especificando la función OPENROWSET.The following example inserts rows from a data file into a table by specifying the OPENROWSET function. La sugerencia de tabla IGNORE_TRIGGERS se especifica para la optimización del rendimiento.The IGNORE_TRIGGERS table hint is specified for performance optimization. Para obtener más ejemplos, vea Importación en bloque de datos mediante las instrucciones BULK INSERT u OPENROWSET(BULK...) (SQL Server).For more examples, see Import Bulk Data by Using BULK INSERT or OPENROWSET(BULK...) (SQL Server).

Se aplica a: desde SQL Server 2008SQL Server 2008 hasta SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

INSERT INTO HumanResources.Department WITH (IGNORE_TRIGGERS) (Name, GroupName)  
SELECT b.Name, b.GroupName   
FROM OPENROWSET (  
    BULK 'C:SQLFilesDepartmentData.txt',  
    FORMATFILE = 'C:SQLFilesBulkloadFormatFile.xml',  
    ROWS_PER_BATCH = 15000)AS b ;  

Invalidar el comportamiento predeterminado del optimizador de consultas mediante sugerenciasOverriding the Default Behavior of the Query Optimizer by Using Hints

Los ejemplos de esta sección demuestran cómo usar sugerencias de tabla para invalidar de forma temporal el comportamiento predeterminado del optimizador de consultas cuando se procesa la instrucción INSERT.Examples in this section demonstrate how to use table hints to temporarily override the default behavior of the query optimizer when processing the INSERT statement.

Precaución

Como el optimizador de consultas de SQL ServerSQL Server suele seleccionar el mejor plan de ejecución de una consulta, se recomienda que únicamente los administradores de bases de datos y desarrolladores experimentados utilicen las sugerencias como último recurso.Because the SQL ServerSQL Server query optimizer typically selects the best execution plan for a query, we recommend that hints be used only as a last resort by experienced developers and database administrators.

S.S. Usar la sugerencia TABLOCK para especificar un método de bloqueoUsing the TABLOCK hint to specify a locking method

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 instrucción INSERT.The following example specifies that an exclusive (X) lock is taken on the Production.Location table and is held until the end of the INSERT statement.

Se aplica a: SQL ServerSQL Server, SQL DatabaseSQL Database.Applies to: SQL ServerSQL Server, SQL DatabaseSQL Database.

INSERT INTO Production.Location WITH (XLOCK)  
(Name, CostRate, Availability)  
VALUES ( N'Final Inventory', 15.00, 80.00);  

Capturar los resultados de la instrucción INSERTCapturing the Results of the INSERT Statement

Los ejemplos de esta sección demuestran cómo usar la cláusula OUTPUT para devolver información de cada fila afectada por una instrucción INSERT o de expresiones que se basan en esta instrucción.Examples in this section demonstrate how to use the OUTPUT Clause to return information from, or expressions based on, each row affected by an INSERT statement. Estos resultados se pueden devolver a la aplicación de procesamiento para que los utilice en mensajes de confirmación, archivado y otros requisitos similares de una aplicación.These results can be returned to the processing application for use in such things as confirmation messages, archiving, and other such application requirements.

T.T. Usar OUTPUT con una instrucción INSERTUsing OUTPUT with an INSERT statement

En el siguiente ejemplo se inserta una fila en la tabla ScrapReason y se utiliza la cláusula OUTPUT para devolver los resultados de la instrucción a la variable de la tabla @MyTableVar.The following example inserts a row into the ScrapReason table and uses the OUTPUT clause to return the results of the statement to the @MyTableVar table variable. Dado que la columna ScrapReasonID se define con una propiedad IDENTITY, no se especifica ningún valor en la instrucción INSERT para dicha columna.Because the ScrapReasonID column is defined with an IDENTITY property, a value is not specified in the INSERT statement for that column. No obstante, debe tener en cuenta que el valor generado por Motor de base de datosDatabase Engine para la columna se devuelve en la cláusula OUTPUT de la columna INSERTED.ScrapReasonID.However, note that the value generated by the Motor de base de datosDatabase Engine for that column is returned in the OUTPUT clause in the INSERTED.ScrapReasonID column.

DECLARE @MyTableVar table( NewScrapReasonID smallint,  
                           Name varchar(50),  
                           ModifiedDate datetime);  
INSERT Production.ScrapReason  
    OUTPUT INSERTED.ScrapReasonID, INSERTED.Name, INSERTED.ModifiedDate  
        INTO @MyTableVar  
VALUES (N'Operator error', GETDATE());  
  
--Display the result set of the table variable.  
SELECT NewScrapReasonID, Name, ModifiedDate FROM @MyTableVar;  
--Display the result set of the table.  
SELECT ScrapReasonID, Name, ModifiedDate   
FROM Production.ScrapReason;  

U.U. Usar OUTPUT con columnas de identidad y calculadasUsing OUTPUT with identity and computed columns

En el siguiente ejemplo se crea la tabla EmployeeSales y, a continuación, se insertan varias filas en ella usando una instrucción INSERT con una instrucción SELECT para recuperar los datos de las tablas de origen.The following example creates the EmployeeSales table and then inserts several rows into it using an INSERT statement with a SELECT statement to retrieve data from source tables. La tabla EmployeeSales contiene una columna de identidad (EmployeeID) y una columna calculada (ProjectedSales).The EmployeeSales table contains an identity column (EmployeeID) and a computed column (ProjectedSales). Puesto que Motor de base de datosDatabase Engine genera estos valores durante la operación de inserción, ninguna de estas columnas se puede definir en @MyTableVar.Because these values are generated by the Motor de base de datosDatabase Engine during the insert operation, neither of these columns can be defined in @MyTableVar.

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;  

V.V. Insertar los datos devueltos por una cláusula OUTPUTInserting data returned from an OUTPUT clause

En el ejemplo siguiente se capturan los datos devueltos por la cláusula OUTPUT de una instrucción MERGE y se insertan en otra tabla.The following example captures data returned from the OUTPUT clause of a MERGE statement, and inserts that data into another table. La instrucción MERGE actualiza diariamente la columna Quantity de la tabla ProductInventory, en función de los pedidos procesados en la tabla SalesOrderDetail de la base de datos AdventureWorks2012AdventureWorks2012.The MERGE statement updates the Quantity column of the ProductInventory table daily, based on orders that are processed in the SalesOrderDetail table in the AdventureWorks2012AdventureWorks2012 database. También elimina las filas correspondientes a los productos cuyas existencias se colocan en el valor 0.It also deletes rows for products whose inventories drop to 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.The example captures the rows that are deleted and inserts them into another table, ZeroInventory, which tracks products with no inventory.

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

W.W. Insertar datos con la opción SELECTInserting data using the SELECT option

En el siguiente ejemplo se muestra cómo insertar varias filas de datos usando una instrucción INSERT con una opción SELECT.The following example shows how to insert multiple rows of data using an INSERT statement with a SELECT option. En la primera instrucción INSERT se usa directamente una instrucción SELECT para recuperar datos de la tabla de origen y, luego, almacenar el conjunto de resultados en la tabla EmployeeTitles.The first INSERT statement uses a SELECT statement directly to retrieve data from the source table, and then to store the result set in the EmployeeTitles table.

CREATE TABLE EmployeeTitles  
( EmployeeKey   INT NOT NULL,  
  LastName     varchar(40) NOT NULL,  
  Title      varchar(50) NOT NULL  
);  
INSERT INTO EmployeeTitles  
    SELECT EmployeeKey, LastName, Title   
    FROM ssawPDW.dbo.DimEmployee  
    WHERE EndDate IS NULL;  

X.X. Especificar una etiqueta con la instrucción INSERTSpecifying a label with the INSERT statement

En el siguiente ejemplo se explica el uso de una etiqueta con una instrucción INSERT.The following example shows the use of a label with an INSERT statement.

-- Uses AdventureWorks  
  
INSERT INTO DimCurrency   
VALUES (500, N'C1', N'Currency1')  
OPTION ( LABEL = N'label1' );  

Y.Y. Usar una etiqueta y una sugerencia de consulta con la instrucción INSERTUsing a label and a query hint with the INSERT statement

Esta consulta muestra la sintaxis básica para usar una etiqueta y una sugerencia de combinación de consulta con la instrucción INSERT.This query shows the basic syntax for using a label and a query join hint with the INSERT statement. Una vez enviada la consulta al nodo de control, SQL ServerSQL Server, que se ejecuta en los nodos de ejecución, se aplica la estrategia de combinación hash al generar el plan de consulta de SQL ServerSQL Server.After the query is submitted to the Control node, SQL ServerSQL Server, running on the Compute nodes, will apply the hash join strategy when it generates the SQL ServerSQL Server query plan. Para más información sobre las sugerencias de combinación y cómo usar la cláusula OPTION, vea OPTION (PDW de SQL Server).For more information on join hints and how to use the OPTION clause, see OPTION (SQL Server PDW).

-- Uses AdventureWorks  
  
INSERT INTO DimCustomer (CustomerKey, CustomerAlternateKey, 
    FirstName, MiddleName, LastName )   
SELECT ProspectiveBuyerKey, ProspectAlternateKey, 
    FirstName, MiddleName, LastName  
FROM ProspectiveBuyer p JOIN DimGeography g ON p.PostalCode = g.PostalCode  
WHERE g.CountryRegionCode = 'FR'  
OPTION ( LABEL = 'Add French Prospects', HASH JOIN);  

Consulte tambiénSee Also

BULK INSERT (Transact-SQL) BULK INSERT (Transact-SQL)
DELETE (Transact-SQL) DELETE (Transact-SQL)
EXECUTE (Transact-SQL) EXECUTE (Transact-SQL)
FROM (Transact-SQL) FROM (Transact-SQL)
IDENTITY (propiedad) (Transact-SQL) IDENTITY (Property) (Transact-SQL)
NEWID (Transact-SQL) NEWID (Transact-SQL)
SELECT (Transact-SQL) SELECT (Transact-SQL)
UPDATE (Transact-SQL) UPDATE (Transact-SQL)
MERGE (Transact-SQL) MERGE (Transact-SQL)
Cláusula OUTPUT (Transact-SQL) OUTPUT Clause (Transact-SQL)
Usar las tablas insertadas y eliminadasUse the inserted and deleted Tables