Insertar datos
Transact-SQL ofrece varias formas de insertar filas en una tabla.
Instrucción INSERT
La instrucción INSERT se usa para agregar una o varias filas a una tabla. La instrucción tiene varios formatos.
A continuación, se muestra la sintaxis básica de una instrucción INSERT simple:
INSERT [INTO] <Table> [(column_list)]
VALUES ([ColumnName or an expression or DEFAULT or NULL],…n)
Con este formato de la instrucción INSERT, denominado INSERT VALUES, puede especificar las columnas que contendrán valores y el orden en el que se presentarán los datos para cada fila insertada en la tabla. El parámetro column_list es opcional, pero recomendado. Sin column_list, la instrucción INSERT esperará un valor para cada columna de la tabla en el orden en que se definieron las columnas. También puede proporcionar los valores de esas columnas como una lista separada por comas.
Al enumerar los valores, la palabra clave DEFAULT indica que se usará un valor predefinido, que se especificó cuando se creó la tabla. Hay tres maneras de definir un valor predeterminado:
- Si se ha definido una columna para que el valor que contiene se genere automáticamente, se usará ese valor. Los valores generados automáticamente se tratarán más adelante en este módulo.
- Cuando se crea una tabla, se puede proporcionar un valor predeterminado para una columna, y ese valor se usará si se especificó DEFAULT.
- Si se ha definido una columna para permitir valores NULL, y se trata de una columna cuyos valores no se generan automáticamente y que no tiene ningún valor predeterminado definido, se insertará NULL como DEFAULT.
Los detalles sobre la creación de la tabla quedan fuera del ámbito de este módulo. Sin embargo, a menudo resulta útil ver qué columnas hay en una tabla. La manera más fácil consiste simplemente en ejecutar una instrucción SELECT en la tabla sin devolver ninguna fila. Si se usa una condición WHERE que nunca puede ser TRUE, no se puede devolver ninguna fila.
SELECT * FROM Sales.Promotion
WHERE 1 = 0;
Esta instrucción mostrará todas las columnas y sus nombres, pero no mostrará los tipos de datos ni ninguna propiedad, como el hecho de que se admitan valores NULL o de que haya algún valor predeterminado especificado. Un ejemplo de la salida de la consulta podría tener este aspecto:
PromotionName
StartDate
ProductModelID
Descuento
Notas
Para insertar datos en esta tabla, puede usar la instrucción INSERT como se muestra aquí.
INSERT INTO Sales.Promotion (PromotionName,StartDate,ProductModelID,Discount,Notes)
VALUES
('Clearance Sale', '01/01/2021', 23, 0.1, '10% discount');
En este ejemplo anterior, se puede omitir la lista de columnas, ya que se proporciona un valor para cada columna en el orden correcto:
INSERT INTO Sales.Promotion
VALUES
('Clearance Sale', '01/01/2021', 23, 0.1, '10% discount');
Supongamos que la tabla está definida de forma que se aplica un valor predeterminado de la fecha actual a la columna StartDate, y la columna Notes admite valores NULL. Puede indicar que desea usar estos valores explícitamente, como se indica a continuación:
INSERT INTO Sales.Promotion
VALUES
('Pull your socks up', DEFAULT, 24, 0.25, NULL);
Como alternativa, puede omitir valores en la instrucción INSERT, en cuyo caso se usará el valor predeterminado si se ha definido, y si no hay ningún valor predeterminado pero la columna admite valores NULL, se insertará un valor NULL. Si no proporciona valores para todas las columnas, debe tener una lista de columnas que indique qué valores de columna se definen.
INSERT INTO Sales.Promotion (PromotionName, ProductModelID, Discount)
VALUES
('Caps Locked', 2, 0.2);
Además de insertar una sola fila a la vez, la instrucción INSERT VALUES se puede usar para insertar varias filas proporcionando varios conjuntos de valores separados por comas. Los conjuntos de valores también están separados por comas, como se muestra a continuación:
(col1_val,col2_val,col3_val),
(col1_val,col2_val,col3_val)
Esta lista de valores se conoce como constructor de valores de tabla. Este es un ejemplo de inserción de dos filas más en la tabla con un constructor de valores de tabla:
INSERT INTO Sales.Promotion
VALUES
('The gloves are off!', DEFAULT, 3, 0.25, NULL),
('The gloves are off!', DEFAULT, 4, 0.25, NULL);
INSERT ... SELECT
Además de especificar un conjunto literal de valores en una instrucción INSERT, T-SQL también admite el uso de los resultados de otras operaciones para proporcionar valores para INSERT. Puede usar los resultados de una instrucción SELECT o la salida de un procedimiento almacenado para proporcionar los valores de la instrucción INSERT.
Para usar INSERT con una instrucción SELECT anidada, cree una instrucción SELECT para reemplazar la cláusula VALUES. Con este formulario, denominado INSERT SELECT, puede insertar el conjunto de filas devuelto por una consulta SELECT en una tabla de destino. El uso de INSERT SELECT presenta las mismas consideraciones que INSERT VALUES:
- Opcionalmente, puede especificar una lista de columnas con el nombre de la tabla.
- Debe proporcionar valores de columna o DEFAULT, o NULL, para cada columna.
La sintaxis siguiente ilustra el uso de INSERT SELECT:
INSERT [INTO] <table or view> [(column_list)]
SELECT <column_list> FROM <table_list>...;
Nota:
Los conjuntos de resultados de los procedimientos almacenados, o incluso los lotes dinámicos, también se pueden usar como entrada para una instrucción INSERT. Este formato de INSERT, denominado INSERT EXEC, es conceptualmente similar a INSERT SELECT y presentará las mismas consideraciones. Sin embargo, los procedimientos almacenados pueden devolver varios conjuntos de resultados, por lo que es necesario extremar las precauciones.
En el ejemplo siguiente se insertan varias filas para una nueva promoción denominada Get Framed, mediante la recuperación del identificador del modelo y el nombre del modelo de la tabla Production.ProductModel para cada modelo que contiene "frame" en su nombre.
INSERT INTO Sales.Promotion (PromotionName, ProductModelID, Discount, Notes)
SELECT DISTINCT 'Get Framed', m.ProductModelID, 0.1, '10% off ' + m.Name
FROM Production.ProductModel AS m
WHERE m.Name LIKE '%frame%';
A diferencia de una subconsulta, la instrucción SELECT anidada que se usa con INSERT no se encierra entre paréntesis.
SELECT ... INTO
Otra opción para insertar filas, que es similar a INSERT SELECT, es la instrucción SELECT INTO. La diferencia más importante entre INSERT SELECT y SELECT INTO es que SELECT INTO no se puede usar para insertar filas en una tabla existente, ya que siempre crea una tabla basada en el resultado de SELECT. Cada columna de la nueva tabla tendrá el mismo nombre, tipo de datos y nulabilidad que la columna o expresión correspondientes en la lista SELECT.
Para usar SELECT INTO, agregue INTO <nombre_de_la_nueva_tabla> en la cláusula SELECT de la consulta, justo antes de la cláusula FROM. Este es un ejemplo que extrae datos de la tabla Sales.SalesOrderHeader en una nueva tabla denominada Sales.Invoice.
SELECT SalesOrderID, CustomerID, OrderDate, PurchaseOrderNumber, TotalDue
INTO Sales.Invoice
FROM Sales.SalesOrderHeader;
Se producirá un error en SELECT INTO si ya hay una tabla con el nombre especificado después de INTO. Una vez creada la tabla, se puede tratar como cualquier otra tabla. Puede seleccionarla, unirla a otras tablas o insertar más filas en ella.