INSERT (Transact-SQL)

Se aplica a:SQL ServerAzure SQL DatabaseInstancia administrada de Azure SQLAzure Synapse AnalyticsAnalytics Platform System (PDW)Almacenamiento en Microsoft FabricBase de datos SQL en Microsoft Fabric

Agrega una o varias filas a una tabla o una vista en SQL Server. Para obtener ejemplos, vea Ejemplos.

Convenciones de sintaxis de Transact-SQL

Sugerencia

Microsoft Fabric Data Warehouse es un almacenamiento relacional de escala empresarial en una base de lago de datos, con una arquitectura lista para el futuro, inteligencia artificial integrada y nuevas características. Si no está familiarizado con el almacenamiento de datos, comience con Fabric Data Warehouse. Las cargas de trabajo del grupo dedicado de SQL pueden actualizarse a Fabric para acceder a funcionalidades avanzadas en ciencia de datos, análisis en tiempo real e informes.

Syntax

Sintaxis para SQL Server y Azure SQL Database y Fabric SQL Database

-- Syntax for SQL Server and Azure SQL Database and Fabric 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 ]  

Sintaxis para Azure Synapse Analytics y Almacenamiento de datos paralelos y Microsoft Fabric Warehouse

-- Syntax for Azure Synapse Analytics and Parallel Data Warehouse and Microsoft Fabric

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 ] ) ]  
[;]  

Arguments

CON <common_table_expression>
Especifica el conjunto temporal de resultados nombrado, también conocido como expresión de tabla común, definido dentro del alcance de la INSERT sentencia. El conjunto de resultados se deriva de una instrucción SELECT. Para más información, consulte WITH common_table_expression (Transact-SQL).

TOP (expresión) [ PERCENT ]
Especifica el número o el porcentaje de filas aleatorias que se van a insertar. expression puede ser un número o un porcentaje de las filas. Para obtener más información, vea TOP (Transact-SQL).

INTO
Es una palabra clave opcional que se puede usar entre INSERT y la tabla de destino.

server_name
Se aplica a: SQL Server 2008 (10.0.x) y versiones posteriores.

Es el nombre del servidor vinculado en el que se encuentra la tabla o la vista. server_name se puede especificar como un nombre de servidor vinculado o usando la función OPENDATASOURCE.

Cuando server_name se especifica como un servidor vinculado, se requiere database_name y schema_name. 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.

database_name
Se aplica a: SQL Server 2008 (10.0.x) y versiones posteriores.

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.

Una variable de tabla , dentro de su ámbito, puede usarse como fuente de tabla en una INSERT sentencia.

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. Por ejemplo, una INSERT vista de múltiples tablas debe usar una column_list que solo referencia columnas de una tabla base. Para más información sobre vistas actualizables, véaseCREATE VIEW (Transact-SQL).

rowset_function_limited
Se aplica a: SQL Server 2008 (10.0.x) y versiones posteriores.

Especifica la función OPENQUERY u OPENROWSET. El uso de estas funciones está sujeto a las capacidades del proveedor OLE DB que tiene acceso al objeto remoto.

CON ( <table_hint_limited> [... n ] )
Especifica una o varias sugerencias de tabla que están permitidas en una tabla de destino. La palabra clave WITH y los paréntesis son obligatorios.

No se permiten READPAST, NOLOCK ni READUNCOMMITTED. Para más información sobre las sugerencias de tabla, vea Sugerencias de tabla (Transact-SQL).

Important

La capacidad de especificar las pistas HOLDLOCK, SERIALIZABLE, READCOMMITTED, REPEATABLEREAD o UPDLOCK en tablas que son objetivos de INSERT sentencias será eliminada en una futura versión de SQL Server. Estas pistas no afectan al rendimiento de INSERT las declaraciones. Evite el uso de dichas sugerencias en los nuevos trabajos de desarrollo y piense en modificar las aplicaciones que las utilizan actualmente.

Especificar la pista TABLOCK en una tabla que es el objetivo de una INSERT sentencia tiene el mismo efecto que especificar la pista TABLOCKX. Se realiza un bloqueo exclusivo en la tabla.

(column_list)
Es una lista de una o más columnas donde se van a insertar los datos. column_list debe ir entre paréntesis y delimitada con comas.

Si la columna no se incluye en column_list, el Motor de base de datos debe ser capaz de proporcionar un valor basado en la definición de la columna; de lo contrario, no se puede cargar la fila. Motor de base de datos proporciona automáticamente un valor para la columna si esta:

  • Tiene una IDENTITY propiedad. 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.

  • Acepta valores NULL. Se usa un valor NULL.

  • Es una columna calculada. Se utiliza el valor calculado.

column_list debe usarse cuando se insertan valores explícitos en una columna identidad, y la SET IDENTITY_INSERT opción debe estar ACTIVADA para la tabla.

OUTPUT Cláusula
Devuelve las filas insertadas como parte de la operación de inserción. Los resultados se pueden devolver a la aplicación de procesamiento o insertarse en una tabla o variable de tabla para su nuevo procesamiento.

La cláusula OUTPUT no está soportada en sentencias DML que hacen referencia a vistas particionadas locales, vistas particionadas distribuidas, tablas remotas o INSERT sentencias que contienen un execute_statement. La cláusula OUTPUT INTO no se soporta en INSERT sentencias que contienen una <cláusula dml_table_source> . Para más información sobre los argumentos y el comportamiento de esta cláusula, vea Cláusula OUTPUT (Transact-SQL).

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 paréntesis.

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.

Puedes usar el constructor de Transact-SQL filas (también llamado constructor de valor de tabla) para especificar múltiples filas en una sola INSERT sentencia. 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. Para más información, vea Constructor con valores de tabla (Transact-SQL).

Note

El constructor del valor de la tabla no se admite en Azure Synapse Analytics. En su lugar, se pueden ejecutar instrucciones INSERT posteriores para insertar varias filas. En Azure Synapse Analytics, los valores de inserción solo pueden ser valores literales constantes o referencias de variables. Para insertar un valor no literal, establezca una variable en un valor que no sea constante e inserte la variable.

DEFAULT
Hace que Motor de base de datos cargue el valor predeterminado definido para una columna. Si no existe ningún valor predeterminado para la columna y esta admite valores NULL, se inserta NULL. En una columna definida con el tipo de datos timestamp, se inserta el siguiente valor de marca de tiempo. DEFAULT no es válido para una columna de identidad.

expression
Es una constante, variable o expresión. La expresión no puede contener una instrucción EXECUTE.

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". Si no se especifica 'N', SQL 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. Los caracteres que no se encuentren en esta página de códigos se perderán.

derived_table
Es cualquier instrucción SELECT válida que devuelva filas con los datos que se van a cargar en la tabla. La instrucción SELECT no puede contener una expresión de tabla común (CTE).

execute_statement
Es cualquier instrucción EXECUTE válida que devuelva datos con instrucciones SELECT o READTEXT. Para obtener más información, vea EXECUTE (Transact-SQL).

Las opciones RESULT SETS de la instrucción EXECUTE no pueden especificarse en un INSERT... Declaración del ejecutivo.

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

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. execute_statement también 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 se puede especificar un parámetro con valores de tabla como destino de una INSERT sentencia EXEC; sin embargo, puede especificarse como una fuente en la INSERT cadena EXEC o en el procedimiento almacenado. Para más información, vea Usar parámetros con valores de tabla (motor de base de datos).

<dml_table_source>
Especifica que las filas insertadas en la tabla destino son aquellas devueltas por la cláusula OUTPUT de una INSERTsentencia, UPDATE, DELETE, o MERGE filtrada opcionalmente por una cláusula WHERE. Si <se especifica dml_table_source> , el objetivo de la afirmación exterior INSERT debe cumplir las siguientes restricciones:

  • Debe ser una tabla base, no una vista.

  • No puede ser una tabla remota.

  • No puede tener definido ningún desencadenador.

  • No puede participar en ninguna relación clave principal-clave externa.

  • No puede participar en la replicación de mezcla ni en las suscripciones actualizables para la replicación transaccional.

El nivel de compatibilidad de la base de datos debe estar establecido en 100 o superior. Para más información, vea Cláusula OUTPUT (Transact-SQL).

<select_list>
Es una lista separada por comas que especifica las columnas devueltas por la cláusula 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.

Note

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 sentencia válida INSERT, UPDATE, DELETE, o MERGE que devuelve las filas afectadas en una cláusula OUTPUT. La instrucción no puede contener una cláusula WITH y no puede tener como destino tablas remotas o vistas con particiones. Si UPDATE o DELETE está especificado, no puede ser un cursor UPDATE o DELETE. No se puede hacer referencia a las filas de origen como instrucciones DML anidadas.

SEARCH_CONDITION WHERE <>
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>. Para más información, vea Condición de búsqueda (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.

DEFAULT VALORES
Se aplica a: SQL Server 2008 (10.0.x) y versiones posteriores.

Hace que la nueva fila contenga los valores predeterminados definidos para cada columna.

BULK
Se aplica a: SQL Server 2008 (10.0.x) y versiones posteriores.

La usan las herramientas externas para cargar un flujo de datos binarios. Esta opción no está diseñada para usarse con herramientas tales como SQL Server Management Studio, SQLCMD, OSQL ni interfaces de programación de aplicaciones de acceso a datos como SQL Server Native Client.

FIRE_TRIGGERS
Se aplica a: SQL Server 2008 (10.0.x) y versiones posteriores.

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. Para obtener más información, vea BULK INSERT (Transact-SQL).

CHECK_CONSTRAINTS
Se aplica a: SQL Server 2008 (10.0.x) y versiones posteriores.

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. Para obtener más información, vea BULK INSERT (Transact-SQL).

KEEPNULLS
Se aplica a: SQL Server 2008 (10.0.x) y versiones posteriores.

Especifica que las columnas vacías deben conservar un valor nulo durante la operación de carga de flujos de datos binarios. Para obtener más información, vea Mantener valores NULL o usar valores predeterminados durante la importación en bloque (SQL Server).

KILOBYTES_PER_BATCH = kilobytes_per_batch
Especifica el número aproximado de kilobytes (KB) de datos por lote como kilobytes_per_batch. Para obtener más información, vea BULK INSERT (Transact-SQL).

ROWS_PER_BATCH =rows_per_batch
Se aplica a: SQL Server 2008 (10.0.x) y versiones posteriores.

Indica el número aproximado de filas de datos del flujo de datos binarios. Para obtener más información, vea BULK INSERT (Transact-SQL).

Note

Si no se proporciona una lista de columnas, se produce un error de sintaxis.

Remarks

Para información específica sobre la inserción de datos en tablas de grafos SQL, véaseINSERT (SQL Graph).

La pista de consulta MAXDOP no es compatible durante INSERT las operaciones SELECT cuando la parte SELECT de la instrucción se lee desde fuentes externas.

Procedimientos recomendados

Utiliza la función @@ROWCOUNT para devolver el número de filas insertadas a la aplicación cliente. Para más información, consulta @@ROWCOUNT (Transact-SQL).

Prácticas recomendadas para la importación masiva de datos

Usando INSERT INTO... SELECT a Importación Masiva de datos con un mínimo de registro y paralelismo

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

El registro mínimo para esta instrucción tiene los requisitos siguientes:

  • El modelo de recuperación de la base de datos está establecido en registro simple o masivo.
  • La tabla de destino es un montón vacío o no vacío.
  • La tabla de destino no se usa en la replicación.
  • La sugerencia TABLOCK se especifica para la tabla de destino.

Las filas que se insertan en un heap como resultado de una acción de inserción en una MERGE sentencia también pueden registrarse mínimamente.

A diferencia de la instrucción BULK INSERT, que contiene un bloqueo de actualización masiva (BU) menos restrictivo, INSERT INTO ... SELECT con la sugerencia TABLOCK retiene un bloqueo exclusivo (X) en la tabla. Esto significa que no se pueden insertar filas mediante varias operaciones de inserción que se ejecutan simultáneamente.

Sin embargo, a partir de SQL Server 2016 (13.x) y del nivel de compatibilidad de la base de datos 130, una única instrucción INSERT INTO ... SELECT se puede ejecutar en paralelo al realizar la inserción en montones o en índices de almacén de columnas (CCI) agrupados. Las inserciones paralelas son posibles cuando se usa la sugerencia TABLOCK.

El paralelismo de la instrucción anterior tiene los siguientes requisitos, que son similares a los requisitos para el registro mínimo:

  • La tabla de destino es un montón vacío o no vacío.
  • La tabla de destino tiene un índice de almacén de columnas agrupado (CCI), pero no índices no agrupados.
  • La tabla objetivo no tiene una columna identidad con IDENTITY_INSERT OFF configurado.
  • La sugerencia TABLOCK se especifica para la tabla de destino.

En los escenarios en los que se cumplen los requisitos de registro mínimo y de inserción en paralelo, ambas mejoras funcionarán juntas para garantizar el máximo rendimiento de las operaciones de carga de datos.

Para más información sobre cómo usarlo INSERT en tu Almacén en Microsoft Fabric, consulta Ingestir datos en tu Almacén usando Transact-SQL.

Note

Las inserciones en las tablas temporales locales (identificadas por el prefijo #) y las tablas temporales globales (identificadas por prefijos ##) también se habilitan para el paralelismo mediante la sugerencia TABLOCK.

Usar OPENROWSET y BULK para datos de importación en bloque

La función OPENROWSET puede aceptar las siguientes pistas de tabla, que proporcionan optimizaciones de carga masiva con la INSERT sentencia:

  • La sugerencia TABLOCK puede reducir al mínimo el número de registros para la operación de inserción. 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. Para más información, vea Requisitos previos para el registro mínimo durante la importación en bloque.
  • La sugerencia TABLOCK puede habilitar operaciones de inserción paralelas. La tabla de destino es un montón o un índice de almacén de columnas agrupado (CCI) sin índices no agrupados, y la tabla de destino no puede tener una columna de identidad especificada.
  • La sugerencia IGNORE_CONSTRAINTS puede deshabilitar temporalmente la comprobación de restricciones FOREIGN KEY y CHECK.
  • La sugerencia IGNORE_TRIGGERS puede deshabilitar temporalmente la ejecución de desencadenadores.
  • 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.
  • 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 están disponibles con el comando BULK INSERT. Para obtener más información, vea Sugerencias de tabla (Transact-SQL).

Tipos de datos

Al insertar filas, considere el comportamiento de los tipos de datos siguientes:

  • Si se carga un valor en columnas con un tipo de dato char, varchar o varbinary , el relleno o truncamiento de los espacios en blanco finales (espacios para char y varchar, ceros para varbinary) está determinado por la SET ANSI_PADDING configuración definida para la columna cuando se creó la tabla. Para obtener más información, vea SET ANSI_PADDING (Transact-SQL).

    La siguiente tabla muestra la operación predeterminada para SET ANSI_PADDING OFF.

    Tipo de dato Operación por defecto
    char Rellena el valor con espacios hasta el ancho definido de la columna.
    varchar 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.
    varbinary Quita los ceros finales.
  • 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.

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

  • 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, el Motor de base de datos no genera automáticamente valores de columnas con el tipo de datos uniqueidentifier. 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. Por ejemplo, 6F9619FF-8B86-D011-B42D-00C04FC964FF es un valor válido de una columna o variable uniqueidentifier. Use la función 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.

  • Suministrar un valor de un tipo de datos del sistema de SQL Server, siempre y cuando el tipo definido por el usuario admita la conversión implícita o explícita desde ese tipo. 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.

    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.

  • Llama a una función definida por el usuario que devuelve un valor del tipo definido por el usuario. 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.

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

Tratamiento de errores

Puedes implementar el manejo de errores para la INSERT sentencia especificando la sentencia en un TRY... CATCH construct.

Si una INSERT sentencia viola una restricción o regla, o si tiene un valor incompatible con el tipo de dato de la columna, la sentencia falla y se devuelve un mensaje de error.

Si INSERT está cargando varias filas con SELECT o EXECUTE, cualquier violación de una regla o restricción que ocurra por los valores que se cargan hace que la sentencia se detenga y no se carguen filas.

Cuando una INSERT sentencia encuentra un error aritmético (desbordamiento, división por cero o error de dominio) durante la evaluación de expresión, el Motor de base de datos gestiona estos errores como si SET ARITHABORT estuviera en ON. El lote se detiene y se devuelve un mensaje de error. Durante la evaluación de expresión, cuando SET ARITHABORT y SETSET ANSI_WARNINGS están OFF, si una INSERTsentencia , DELETE o UPDATE encuentra un error aritmético, un desbordamiento, una división por cero o un 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 acción de inserción o actualización y el usuario recibe un error.

Interoperability

Cuando se define un INSTEAD OF disparador sobre INSERT acciones contra una tabla o vista, el disparador se ejecuta en lugar de la INSERT sentencia. Para más información sobre INSTEAD OF los desencadenantes, véaseCREATE 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 usa TOP con INSERT las filas referenciadas, las filas no se ordenan en ningún orden y la cláusula ORDER BY no puede especificarse directamente en estas sentencias. 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. Vea la sección Ejemplos que aparece más adelante en este tema.

INSERT las consultas que usan SELECT con ORDER BY para llenar las filas garantizan cómo se calculan los valores de identidad, pero no el orden en que se insertan las filas.

En Parallel Data Warehouse, la cláusula ORDER BY es inválida en VIEWS, CREATE TABLE AS SELECT, INSERT SELECT, funciones en línea, tablas derivadas, subconsultas y expresiones de tablas comunes, salvo que también se especifique TOP.

Comportamiento de registro

La INSERT sentencia siempre está completamente registrada, excepto cuando se utiliza la función OPENROWSET con la palabra clave BULK o cuando se utiliza INSERT INTO <target_table> SELECT <columns> FROM <source_table>. Estas operaciones pueden ser registradas mínimamente. Para obtener más información, vea la sección "Prácticas recomendadas para la carga masiva de datos" anteriormente en este tema.

Security

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. Para que esta conexión funcione, debe crear una asignación de inicio de sesión entre los servidores vinculados usando sp_addlinkedsrvlogin.

Cuando utilice OPENROWSET (BULK…), es importante que entienda el modo en el que SQL Server controla la suplantación. Para más información, consulte "Consideraciones de seguridad" en Importar datos masivos usando BULK INSERT o OPENROWSET(BULK...) (SQL Server).

Permissions

INSERT Se requiere permiso en la tabla de objetivos.

INSERT Los permisos por defecto corresponden a los miembros del sysadmin rol fijo del servidor, los db_owner roles fijos de base de datos y db_datawriter el 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 opción OPENROWSET función BULK, debes ser miembro del sysadmin rol fijo de servidor o del bulkadmin rol fijo de servidor.

Examples

Category Elementos de sintaxis ofrecidos
Sintaxis básica INSERT * constructor de valor de tabla
Tratar los valores de columna IDENTITY * NEWID * valores por defecto * tipos definidos por el usuario
Insertar datos de otras tablas INSERT... SELECT * INSERT... EXECUTE * CON la expresión común de tabla * TOP * OFFSET FETCH
Especificar objetos de destino que no sean tablas estándar Vistas * variables de tabla
Insertar filas en una tabla remota Servidor vinculado * función de conjunto de filas OPENQUERY * función de conjunto de filas OPENDATASOURCE
Cargar datos de forma masiva de tablas o archivos de datos INSERT... SELECT * función OPENROWSET
Invalidar el comportamiento predeterminado del optimizador de consultas mediante sugerencias Sugerencias de tabla
Captura de los resultados de la INSERT afirmación Cláusula OUTPUT

Sintaxis básica

Los ejemplos de esta sección demuestran la funcionalidad básica de la INSERT afirmación usando la sintaxis mínima requerida.

A. Insertar una sola fila de datos

El siguiente ejemplo inserta una fila en la Production.UnitMeasure tabla de la base de datos AdventureWorks2025. Las columnas de esta tabla son UnitMeasureCode, Name y ModifiedDate. Dado que los valores para todas las columnas se suministran e incluyen en el mismo orden que las columnas de la tabla, no es necesario especificar los nombres de columna en la lista de columnas*.*

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

B. Insertar varias filas de datos

El siguiente ejemplo utiliza el constructor de valores de la tabla para insertar tres filas en la Production.UnitMeasure tabla de la base de datos AdventureWorks2025 en una sola INSERT sentencia. 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.

Note

El constructor del valor de la tabla no se admite en Azure Synapse Analytics.

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 están en el mismo orden que las columnas de la tabla

En el siguiente ejemplo se utiliza una lista de columnas para especificar de forma explícita los valores insertados en cada columna. El orden de las columnas en la Production.UnitMeasure tabla de la base de datos AdventureWorks2025 es UnitMeasureCode, Name, ModifiedDate; sin embargo, las columnas no aparecen en ese orden en column_list.

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

Tratar los valores de columna

Ejemplos en esta sección demuestran métodos para insertar valores en columnas definidas con una IDENTITY propiedad, DEFAULT valor o con tipos de datos como identificador único o columnas de tipo definidas por el usuario.

D. Insertar datos en una tabla con columnas que tienen valores predeterminados

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. Column_1 es una columna calculada que genera automáticamente un valor concatenando una cadena con el valor insertado en column_2. Column_2 se define con una restricción 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 automáticamente un número binario único que se incrementa. Column_4 no genera automáticamente ningún valor. Cuando no se especifica un valor para esta columna, se inserta NULL. Las INSERT sentencias insertan filas que contienen valores para algunas columnas, pero no para todas. En la última INSERT sentencia, no se especifican columnas y solo se insertan los valores por defecto usando la DEFAULT cláusula VALUES.

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. Insertar datos en una tabla con una columna de identidad

En el siguiente ejemplo se muestran los distintos métodos para insertar datos en una columna de identidad. Las dos INSERT primeras sentencias permiten generar valores identidad para las nuevas filas. La tercera INSERT sentencia anula la IDENTITY propiedad de la columna junto con la SETSET IDENTITY_INSERT sentencia e inserta un valor explícito en la columna de identidad.

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. Insertar datos en una columna uniqueidentifier mediante NEWID()

En el siguiente ejemplo se usa la función NEWID() para obtener un GUID para column_2. A diferencia de las columnas de identidad, el Motor de base de datos no genera automáticamente valores de columnas con el tipo de datos uniqueidentifier, según se muestra en la segunda instrucción INSERT.

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. 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 usan la función CONVERT para convertir un valor de cadena al tipo Point y la tercera usa la función CAST. Para más información, vea Manipulating UDT Data (Manipular datos de 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 sección demuestran métodos para insertar filas de una tabla en otra.

H. Usar las opciones SELECT y EXECUTE para insertar datos de otras tablas

El siguiente ejemplo muestra cómo insertar datos de una tabla en otra tabla usando INSERT... SELECT o INSERT... EJECUTAR. 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.

La primera INSERT instrucción utiliza una sentencia SELECT para derivar los datos de las tablas fuente (Employee, SalesPerson, y Person) en la base de datos AdventureWorks2025 y almacenar el conjunto de resultados en la EmployeeSales tabla. La segunda INSERT sentencia utiliza la cláusula EXECUTE para llamar a un procedimiento almacenado que contiene la sentencia SELECT, y la tercera INSERT utiliza la cláusula EXECUTE para referenciar la sentencia SELECT como una cadena literal.

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. Usar la expresión de tabla común WITH para definir los datos insertados

El siguiente ejemplo crea la NewEmployee tabla en la base de datos AdventureWorks2025. 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. La INSERT sentencia hace referencia a las columnas de la expresión de la tabla común.

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. Usar TOP para limitar los datos insertados de la tabla de origen

El siguiente ejemplo crea la tabla EmployeeSales e inserta el nombre y los datos de ventas acumulados en el año de los 5 empleados aleatorios principales de la tabla HumanResources.Employee en la base de datos AdventureWorks2025. La INSERT instrucción elige cualquier 5 filas devueltas por la SELECT sentencia. La cláusula OUTPUT muestra las filas que se insertan en la tabla EmployeeSales. Observe que la cláusula ORDER BY de la instrucción SELECT no se utiliza para determinar los primeros 5 empleados.

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. La cláusula OUTPUT muestra las filas que se insertan en la tabla EmployeeSales. 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.

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

En los ejemplos de esta sección se muestra cómo insertar filas especificando una variable de tabla o vista.

K. 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 instrucción INSERT debe coincidir con el orden de las columnas de la vista. Para más información, vea Modificar datos mediante una vista.

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. Insertar datos en una variable de tabla

El siguiente ejemplo especifica una variable de tabla como objeto destino en la base de datos AdventureWorks2025.

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

Insertar filas en una tabla remota

Los ejemplos de esta 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.

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

El ejemplo siguiente inserta filas en una tabla remota. En el ejemplo primero se crea un vínculo al origen de datos remoto mediante sp_addlinkedserver. El nombre del servidor vinculado, MyLinkServer, se especifica después como parte del nombre de objeto de cuatro partes con el formatoserver.catalog.schema.object.

Se aplica a: SQL Server 2008 (10.0.x) y versiones posteriores.

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'AdventureWorks2022';  
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.AdventureWorks2022.HumanResources.Department (Name, GroupName)  
VALUES (N'Public Relations', N'Executive General and Administration');  
GO  

N. Insertar datos en una tabla remota con una función OPENQUERY

En el siguiente ejemplo se inserta una fila en una tabla remota especificando la función 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 (10.0.x) y versiones posteriores.

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

O. Insertar datos en una tabla remota con una función OPENDATASOURCE

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. Especifique un nombre de servidor válido para el origen de datos con el formato server_name o server_name\instance_name.

Se aplica a: SQL Server 2008 (10.0.x) y versiones posteriores.

-- 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')  
    .AdventureWorks2022.HumanResources.Department (Name, GroupName)  
    VALUES (N'Standards and Methods', 'Quality Assurance');  
GO  

P. Insertar en una tabla externa creada con PolyBase

Exporte datos de SQL Server a Hadoop o Azure Storage. En primer lugar, cree una tabla externa que apunte al directorio o archivo de destino. Luego, utiliza INSERT INTO para exportar datos de una tabla local de SQL Server a una fuente de datos externa. La INSERT instrucción 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. Para obtener más información, vea Introducción a PolyBase.

Se aplica a: SQL Server.

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

Ejemplos en esta sección demuestran dos métodos para cargar datos en masa en una tabla usando la INSERT sentencia.

Q. Insertar datos en un montón con registro mínimo

El ejemplo siguiente crea una tabla nueva (un montón) e inserta los datos en ella desde otra tabla con registro mínimo. El ejemplo supone que el modelo de recuperación de la base de datos AdventureWorks2025 está establecido en FULL. Para asegurar que se use un registro mínimo, el modelo de recuperación de la AdventureWorks2025 base de datos se configura para BULK_LOGGED antes de insertar las filas y se restablece a FULL después de que el INSERT INTO... Instrucción SELECT. Además, se especifica la sugerencia TABLOCK para la tabla de destino Sales.SalesHistory. Esto asegura que la instrucción use el espacio mínimo 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 AdventureWorks2022  
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 AdventureWorks2022  
SET RECOVERY FULL;  
GO  

R. Usar la función 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 función OPENROWSET. La sugerencia de tabla IGNORE_TRIGGERS se especifica para la optimización del rendimiento. Para más ejemplos, véase Importar datos masivos usando BULK INSERT o OPENROWSET(BULK...) (SQL Server).

Se aplica a: SQL Server 2008 (10.0.x) y versiones posteriores.

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 sugerencias

Ejemplos en esta sección demuestran cómo usar pistas de tabla para anular temporalmente el comportamiento predeterminado del optimizador de consultas al procesar la INSERT sentencia.

Caution

Como el optimizador de consultas de SQL 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.

S. Usar la sugerencia TABLOCK para especificar un método de bloqueo

El siguiente ejemplo especifica que se realiza un bloqueo exclusivo (X) en la tabla Production.Location y se mantiene hasta el final de la INSERT sentencia.

Se aplica a: SQL Server, SQL Database.

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

Captura de los resultados de la INSERT afirmación

Ejemplos en esta sección demuestran cómo usar la Cláusula OUTPUT para devolver información o expresiones basadas en cada fila afectada por una INSERT sentencia. 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.

T. Usando OUTPUT con una INSERT sentencia

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. 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. No obstante, debe tener en cuenta que el valor generado por Motor de base de datos para la columna se devuelve en la cláusula OUTPUT 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.  
SELECT ScrapReasonID, Name, ModifiedDate   
FROM Production.ScrapReason;  

U. Usar OUTPUT con columnas de identidad y calculadas

El siguiente ejemplo crea la EmployeeSales tabla y luego inserta varias filas en ella usando una INSERT sentencia con una instrucción SELECT para recuperar datos de las tablas fuente. 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 operación de inserción, ninguna de estas columnas se puede definir en @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. Insertar los datos devueltos por una cláusula OUTPUT

El siguiente ejemplo captura los datos devueltos de la cláusula OUTPUT de una MERGE sentencia e inserta esos datos en otra tabla. El MERGE estado actualiza la Quantity columna de la ProductInventory tabla diariamente, basándose en los pedidos que se procesan en la SalesOrderDetail tabla de la base de datos AdventureWorks2025. También 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.

--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. Insertar datos con la opción SELECT

El siguiente ejemplo muestra cómo insertar varias filas de datos usando una INSERT sentencia con la opción SELECT. 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.

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. Especificar una etiqueta con la INSERT declaración

El siguiente ejemplo muestra el uso de una etiqueta con una INSERT afirmación.

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

Y. Usar una etiqueta y una pista de consulta junto con la INSERT sentencia

Esta consulta muestra la sintaxis básica para usar una etiqueta y una sugerencia de unión de consulta con la INSERT sentencia. Una vez enviada la consulta al nodo de control, SQL 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 Server. 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).

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

Véase también

BULK INSERT (Transact-SQL)
DELETE (Transact-SQL)
EJECUTAR (Transact-SQL)
DE (Transact-SQL)
IDENTITY (Propiedad) (Transact-SQL)
NEWID (Transact-SQL)
SELECT (Transact-SQL)
UPDATE (Transact-SQL)
MERGE (Transact-SQL)
OUTPUT (cláusula de Transact-SQL)
Usar las tablas insertadas y eliminadas