Published on

March 19, 2020

Comprendiendo la instrucción INSERT INTO en SQL Server

La instrucción INSERT INTO es una herramienta poderosa en SQL Server que te permite agregar una o más filas a una tabla o vista de destino. En este artículo, exploraremos los diferentes formatos de sintaxis y escenarios de uso para esta instrucción.

Uso

La instrucción INSERT INTO se utiliza principalmente para agregar filas a una tabla o vista de destino en SQL Server. Puedes proporcionar valores constantes en la instrucción o copiar filas de una tabla o vista de origen.

Sintaxis

La instrucción INSERT INTO tiene una sintaxis dinámica que se puede adaptar a varios procesos de inserción de datos. Para ver una vista detallada de la sintaxis, puedes consultar la documentación de Microsoft INSERT INTO.

Aquí tienes un ejemplo de la sintaxis utilizada para insertar una sola fila en una tabla o vista de base de datos de SQL Server:

INSERT INTO tabla (columna1, columna2, ...) VALUES (expresión1, expresión2, ...);

Y aquí tienes un ejemplo de la sintaxis utilizada para insertar múltiples filas desde una tabla de base de datos de origen:

INSERT INTO tabla (columna1, columna2, ...) SELECT expresión1, expresión2, ... FROM tabla_origen [WHERE condiciones];

En estas declaraciones de sintaxis:

  • tabla es el nombre de la tabla de destino donde se insertarán las filas
  • columna1, columna2 son los nombres de las columnas en la tabla de destino que se llenarán con los valores proporcionados
  • expresión1, expresión2 son los valores que se asignarán a las columnas mencionadas en la tabla de destino según el orden proporcionado
  • tabla_origen es el nombre de la tabla desde la cual se copiarán e insertarán los valores en la tabla de destino
  • condiciones son condiciones opcionales para filtrar los valores de la tabla de origen

La palabra clave INTO en la instrucción INSERT INTO es opcional.

Empezando

Comencemos creando una nueva tabla de prueba con fines de demostración. Esta tabla tendrá una columna IDENTITY, columnas NULL y NOT NULL. Realizaremos cambios gradualmente en esta tabla para cubrir la mayoría de los casos de uso comunes para la instrucción INSERT INTO.

Aquí tienes la declaración T-SQL para crear la tabla de demostración:

CREATE TABLE InsertDemo (
    ID INT IDENTITY PRIMARY KEY,
    StName NVARCHAR(100) NOT NULL,
    StBirthDate DateTime NOT NULL,
    StGrade int NULL,
    StAddress NVARCHAR(MAX) NULL,
    StParentsPhone VARCHAR(25) NOT NULL
);

Ejemplos

Exploraremos algunos ejemplos de uso de la instrucción INSERT INTO.

Para agregar un nuevo registro a la tabla creada, puedes proporcionar los valores en un formato constante. Asegúrate de proporcionar valores para todas las columnas NULL y NOT NULL, excepto para las columnas generadas automáticamente, en el orden correcto:

INSERT INTO InsertDemo VALUES ('John', '2000-08-12', 5, 'London', '56896652');

Si deseas insertar múltiples registros en la misma instrucción INSERT INTO, puedes proporcionar los valores para cada fila en un formato separado por comas:

INSERT INTO InsertDemo VALUES
    ('Jack', '2000-02-10', 5, 'London', '56552244'),
    ('Daniel', '2000-07-24', 5, 'Oxford', '56448899'),
    ('Gonzalo', '2000-01-13', 5, 'Cambridge', '56254896');

Si solo deseas insertar valores en columnas específicas, puedes mencionar los nombres de estas columnas y proporcionar los valores en el mismo orden:

INSERT INTO InsertDemo (StName, StBirthDate, StParentsPhone) VALUES ('Zaid', '2000-04-12', '56986532');

También puedes proporcionar la lista de columnas en un orden diferente al de la tabla de destino. Solo asegúrate de asignar valores a las columnas en el mismo orden que se enumeran en la instrucción INSERT INTO:

INSERT INTO InsertDemo (StParentsPhone, StName, StBirthDate) VALUES ('56458722', 'David', '2000-12-06');

Ten en cuenta que si intentas asignar valores solo a columnas específicas, la ejecución de la instrucción fallará si no proporcionas un valor para una columna NOT NULL:

INSERT INTO InsertDemo (StName, StBirthDate) VALUES ('Swathi', '2000-11-04');

La instrucción INSERT INTO también puede manejar columnas calculadas. Estas columnas se calculan automáticamente en función de una ecuación definida y no se pueden insertar explícitamente:

ALTER TABLE InsertDemo ADD AGE AS DATEDIFF(YEAR, StBirthDate, GETDATE());

Si intentas insertar un valor explícito en una columna calculada, la ejecución de la instrucción fallará:

INSERT INTO InsertDemo (StName, StBirthDate, StParentsPhone, AGE) VALUES ('Prashanth', '2000-03-15', '594214478', 12);

De manera similar, no puedes insertar un valor explícito en una columna de identidad, ya que se genera automáticamente:

INSERT INTO InsertDemo (ID, StName, StBirthDate, StParentsPhone) VALUES (12, 'Prashanth', '2000-03-15', '594214478');

Si necesitas insertar un valor explícito en una columna de identidad, puedes habilitar la propiedad IDENTITY_INSERT antes de ejecutar la instrucción INSERT INTO y deshabilitarla después de insertar el valor:

SET IDENTITY_INSERT InsertDemo ON;

INSERT INTO InsertDemo (ID, StName, StBirthDate, StParentsPhone) VALUES (12, 'Prashanth', '2000-03-15', '594214478');

SET IDENTITY_INSERT InsertDemo OFF;

Es importante tener en cuenta que proporcionar un valor explícito para una columna de identidad no se recomienda a menos que tengas un requisito específico, ya que puede crear brechas en los valores de identidad.

También puedes usar la instrucción INSERT INTO para agregar filas a una tabla de destino desde otra tabla de origen. Simplemente proporciona la lista de columnas en la tabla de destino y las columnas relacionadas de la tabla de origen:

INSERT INTO [dbo].[InsertDemo] (STD_Guid, StName, StBirthDate, StParentsPhone)
SELECT TOP (10) P.[rowguid], P.[FirstName] + P.[MiddleName] + P.[LastName] AS StName, P.[ModifiedDate], PP.PhoneNumber
FROM [Person].[Person] P
JOIN [Person].[PersonPhone] PP ON P.BusinessEntityID = PP.BusinessEntityID
WHERE P.[FirstName] + P.[MiddleName] + P.[LastName] IS NOT NULL AND PP.PhoneNumber IS NOT NULL;

Puedes controlar el número de columnas insertadas utilizando la opción TOP en la cláusula INSERT:

INSERT TOP (10) INTO [dbo].[InsertDemo] (STD_Guid, StName, StBirthDate, StParentsPhone)
SELECT P.[rowguid], P.[FirstName] + P.[MiddleName] + P.[LastName] AS StName, P.[ModifiedDate], PP.PhoneNumber
FROM [Person].[Person] P
JOIN [Person].[PersonPhone] PP ON P.BusinessEntityID = PP.BusinessEntityID
WHERE P.[FirstName] + P.[MiddleName] + P.[LastName] IS NOT NULL AND PP.PhoneNumber IS NOT NULL;

La instrucción INSERT INTO también se puede utilizar para agregar filas a una tabla de base de datos ubicada en un servidor remoto utilizando las instrucciones OPENQUERY o OPENDATASOURCE.

Finalmente, puedes usar la cláusula OUTPUT con la instrucción INSERT INTO para recuperar información sobre cada fila agregada por la instrucción. Esta información se puede utilizar para mensajes de confirmación o para archivar datos.

Por ejemplo, puedes crear una tabla temporal para almacenar los nombres de los estudiantes insertados:

CREATE TABLE #InsertAudit (StName NVARCHAR(100));

INSERT INTO InsertDemo (STD_Guid, StName, StBirthDate, StParentsPhone)
OUTPUT INSERTED.StName INTO #InsertAudit
VALUES (NEWID(), 'Doni', '2000-07-10', '59785887');

SELECT * FROM #InsertAudit;

Al consultar la tabla temporal, puedes ver los nombres de los estudiantes insertados.

Estos ejemplos demuestran la versatilidad y el poder de la instrucción INSERT INTO en SQL Server. Con sus diversos formatos de sintaxis y escenarios de uso, puedes agregar fácilmente filas a tus tablas y vistas de base de datos.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.