SQL

¿Cómo insertar varios registros en un solo INSERT en SQL?

Estrada Web Group
Estrada Web Group
¿Cómo insertar varios registros en un solo INSERT en SQL?

En este tutorial veremos cómo insertar varias filas de datos en un solo query o consulta en SQL Server, hoy mismo me encuentro con una situación en la que tengo que insertar varias filas de datos con una sola consulta o SQL Query. Es necesario que en un solo INSERT inserte “n” filas en SQL Server, lo primero que se me ocurrió fue crear un bucle para realizar las inserciones, pero investigue un poco y encontré una mejor solución.

Introducción insertar varios registros en una sola sentencia en SQL

Insertar varios registros en una sola sentencia en SQL Server es una tarea común en la programación de bases de datos. Existen varias formas de hacerlo, cada una con sus propias ventajas y desventajas. Algunas de las formas más comunes son utilizando la sintaxis VALUES, SELECT y tablas temporales.  

En este artículo, se describirán estas diferentes formas de insertar varios registros en una sola sentencia, incluyendo ejemplos de código y explicaciones detalladas de cómo funcionan. Además, se discutirá cómo devolver el resultado de los registros insertados utilizando la cláusula OUTPUT, la función SCOPE_IDENTITY y la función @@ROWCOUNT.

En el tutorial anterior, aprendió a agregar una fila a la vez a una tabla mediante la instrucción INSERT. Si lo que necesitas eliminar los registros duplicados puedes consultar este tutorial.

¿Cómo insertar varios registros en un solo INSERT en SQL?

Para agregar varias filas a una tabla a la vez, use la siguiente forma de la instrucción INSERT:

INSERT INTO tabla (columna1, columna2, ...) 

VALUES (valor1, valor2, ...), 
(valor1, valor2, ...), 
...
(valor1n, valor2n, ...); 

En esta sintaxis, en lugar de utilizar una sola lista de valores, utiliza varias listas de valores separadas por comas para la inserción.

El número de filas que puede insertar a la vez es de 1,000 filas con esta forma de la instrucción INSERT. Si desea insertar más filas que eso, debería considerar usar múltiples instrucciones INSERT, BULK INSERT o una tabla derivada.

Tenga en cuenta que esta sintaxis de INSERTAR varias filas solo es compatible con SQL Server 2008 o posterior.

Esta forma de insertar varios registros en una sola sentencia INSERT utilizando la sintaxis VALUES, es la más simple y fácil de entender. Simplemente se especifican los valores a insertar en cada columna dentro de paréntesis, y se separan cada conjunto de valores mediante una coma. Por ejemplo:

INSERT INTO clientes (nombre, apellido, edad)
VALUES ('Juan', 'Pérez', 30), ('Maria', 'García', 25), ('Pedro', 'Martín', 40);

¿Cómo insertar varios registros en un solo INSERT en SQL con SELECT?

Para agregar varias filas a una tabla a la vez, puedes usar la sintaxis SELECT con la instrucción INSERT:

INSERT INTO tabla (columna1, columna2, ...)
SELECT valor1, valor2, ...
FROM otra_tabla
WHERE alguna_condicion = true;

Está forma es utilizando la sintaxis SELECT. En este caso se seleccionan los valores desde otra tabla o consulta y se insertan en la tabla especificada. Por ejemplo:

INSERT INTO clientes_de_oro (nombre, apellido, edad)
SELECT nombre, apellido, edad FROM clientes
WHERE fecha_ultima_compra >= '2020-01-01';

¿Cómo insertar varios registros en un solo INSERT en SQL con una tabla temporal?

Para agregar varias filas a una tabla a la vez, puedes utilizar una tabla temporal con la instrucción INSERT:

DECLARE @tabla_temporal TABLE (columna1 int, columna2 varchar(50), ...);

INSERT INTO @tabla_temporal (columna1, columna2, ...)
VALUES (valor1, valor2, ...), (valor1, valor2, ...), ...;

INSERT INTO tabla (columna1, columna2, ...)
SELECT columna1, columna2, ...
FROM @tabla_temporal;

Esta forma es utilizando una tabla temporal. Una tabla temporal es un objeto temporal en SQL Server que se utiliza para almacenar datos temporalmente. En este caso se crea una tabla temporal y se insertan los datos en ella, y luego se utiliza una sentencia SELECT para insertar los datos en la tabla destino. Por ejemplo:

DECLARE @tabla_temporal TABLE (nombre varchar(50), apellido varchar(50), edad int);

INSERT INTO @tabla_temporal (nombre, apellido, edad)
VALUES ('Juan', 'Pérez', 30), ('Maria', 'García', 25), ('Pedro', 'Martín', 40);

INSERT INTO clientes (nombre, apellido, edad)
SELECT nombre, apellido, edad
FROM @tabla_temporal;

Por último, mencionar, que es posible también utilizar una tabla variable la cual es similar a una tabla temporal con la diferencia que se declara con la palabra clave DECLARE @tabla_variable TABLE, en lugar de DECLARE @tabla_temporal TABLE y tiene una duración más corta y solo está disponible para la sesión actual del usuario que la creo.

SQL Server INSERTAR varias filas - ejemplos

Utilizaremos la tabla sales.promotions creada en el tutorial anterior para la demostración.

Si aún no ha creado la tabla sales.promotions, puede usar la siguiente instrucción CREATE TABLE:

CREATE TABLE sales.promotions (
    promotion_id INT PRIMARY KEY IDENTITY (1, 1),
    promotion_name VARCHAR (255) NOT NULL,
    discount NUMERIC (3, 2) DEFAULT 0,
    start_date DATE NOT NULL,
    expired_date DATE NOT NULL
); 

Insertar varias filas en SQL Server y devolver el resultado de lista insertada

SQL Server proporciona varias formas de devolver el resultado de los registros insertados. A continuación, se describen algunas de las formas más comunes:

Utilizando la cláusula OUTPUT:

INSERT INTO tabla (columna1, columna2, ...)

OUTPUT inserted.columna1, inserted.columna2, ...

VALUES (valor1, valor2, ...), (valor1, valor2, ...), ...;

La cláusula OUTPUT se utiliza para devolver un conjunto de valores que se han insertado en la tabla. El prefijo "inserted" se refiere a las filas insertadas.

Utilizando la función SCOPE_IDENTITY():

DECLARE @id INT;

INSERT INTO tabla (columna1, columna2, ...)
VALUES (valor1, valor2, ...), (valor1, valor2, ...), ...;

SET @id = SCOPE_IDENTITY();

La función SCOPE_IDENTITY() devuelve el último valor insertado en la tabla. Es importante tener en cuenta que sólo funciona si la tabla tiene una columna con una restricción de identidad y se debe utilizar después de la sentencia INSERT.

Utilizando la función @@ROWCOUNT:

INSERT INTO tabla (columna1, columna2, ...)
VALUES (valor1, valor2, ...), (valor1, valor2, ...), ...;

PRINT @@ROWCOUNT;

La función @@ROWCOUNT devuelve el número de filas afectadas por la última sentencia ejecutada. En este caso, devuelve el número de filas insertadas.

1) Ejemplo de inserción de varias filas

La siguiente instrucción inserta varias filas en la tabla sales.promotions:

INSERT INTO sales.promotions (
    promotion_name,
    discount,
    start_date,
    expired_date
)
VALUES
    (
        '2020 Estrada Web Group Promotion',
        0.15,
        '20190601',
        '20190901'
    ),
    (
        '2019 Fall Promotion',
        0.20,
        '20191001',
        '20191101'
    ),
    (
        '2019 Winter Promotion',
        0.25,
        '20191201',
        '20200101'
    );

El servidor SQL emitió el siguiente mensaje que indica que tres filas se han insertado correctamente.

(3 rows affected)

Verifiquemos la inserción ejecutando la siguiente consulta:

Aquí está la salida:

sql server  insertar varias columnas en sql server

2) Insertar varias filas y devolver el resultado de lista insertada

Este ejemplo inserta tres filas en la tabla sales.promotions y devuelve la lista de id´s de promoción:

INSERT INTO 
 sales.promotions ( 
 promotion_name, discount, start_date, expired_date
 )
OUTPUT inserted.promotion_id
VALUES
 ('2020 Summer Promotion',0.25,'20200601','20200901'),
 ('2020 Fall Promotion',0.10,'20201001','20201101'),
 ('2020 Winter Promotion', 0.25,'20201201','20210101');

insertar varias filas en una tabla utilizando una sola instrucción INSERT de SQL Server.

En este ejemplo, agregamos la cláusula OUTPUT con la columna que queremos devolver utilizando la sintaxis insert.column_name. Si desea devolver valores de varias columnas, puede usar la siguiente sintaxis:

OUTPUT inserted.column1, inserted.column2...

Resumen

En conclusión, insertar varios registros en una sola sentencia en SQL Server es una tarea común en la programación de bases de datos y existen varias formas de hacerlo. Cada una de estas formas tiene sus propias ventajas y desventajas, y dependerá de las necesidades específicas de su proyecto para determinar cuál utilizar. Utilizando la sintaxis VALUES, SELECT o tablas temporales son las formas mas comunes de hacerlo. Además, es posible devolver el resultado de los registros insertados utilizando la cláusula OUTPUT, la función SCOPE_IDENTITY y la función @@ROWCOUNT.

En este tutorial, aprendió a usar de otra forma la instrucción INSERT de SQL Server para insertar varias filas en una tabla utilizando una instrucción INSERT.

Espero que este artículo haya sido útil para comprender cómo insertar varios registros en una sola sentencia en SQL Server. Si tiene alguna pregunta o comentario adicional, por favor no dude en comentar y compartir este artículo con sus colegas y amigos interesados.

Temas que te ayudaran en SQL Server:

Compartir artículo:

Más artículos geniales

Cómo agregar una o más columnas a una tabla en SQL con ALTER TABLE ADD

Cómo agregar una o más columnas a una tabla en SQL con ALTER TABLE ADD

Resumen: en este artículo, aprenderás a usar la instrucción ALTER TABLE ADD de SQL Server para agregar una o más columnas a una tabla.

Ver artículo completo
Para qué sirven los operadores AND y OR de SQL Server

Para qué sirven los operadores AND y OR de SQL Server

Los operadores AND y OR de SQL son operadores booleanos utilizados para especificar condiciones compuestas en una cláusula WHERE.

Ver artículo completo
Cómo usar la expresión NULLIF de SQL Server para devolver NULL si el primer argumento es igual al segundo

Cómo usar la expresión NULLIF de SQL Server para devolver NULL si el primer argumento es igual al segundo

Resumen: en este tutorial, aprenderás a usar la expresión NULLIF de SQL Server para devolver NULL si el primer argumento es igual al segundo.

Ver artículo completo

Manténgase actualizado

Obtenga excelente contenido en su bandeja de entrada todas las semanas.
Solo contenido excelente, no compartimos su correo electrónico con terceros.
Subir al inicio de la pantalla