lunes, 18 de enero de 2010

Sentencias Insert y Select en SQL Server

Puede usar las instrucciones INSERT y SELECT para agregar filas a una tabla de las siguientes maneras:
  • Utilice la instrucción INSERT para especificar valores directamente o desde una subconsulta.
  • Utilice la instrucción SELECT con la cláusula INTO.
 Utilizar INSERT
La instrucción INSERT agrega una o más filas nuevas a una tabla. Tratada de forma simplificada, INSERT tiene el siguiente formato:
INSERT [INTO] table_or_view [(column_list)] data_values
La instrucción INSERT inserta data_values como una o más filas en la tabla o vista especificada. column_list es una lista separada por comas de los nombres de columnas que se pueden utilizar para especificar las columnas para las que se suministran datos. Si no se especifica column_list, todas las columnas de la tabla o vista reciben datos.
Cuando column_list no especifica todas las columnas de la tabla o vista, se inserta el valor predeterminado, si se ha definido alguno para la columna, o un valor de NULL en aquellas columnas que no se hayan especificado en la lista. Todas las columnas no especificadas en la lista de columnas deben permitir valores NULL o tener asignado un valor predeterminado.
Las instrucciones INSERT no especifican valores para los siguientes tipos de columnas porque SQL Server Database Engine (Motor de base de datos de SQL Server) genera los valores de las siguientes columnas:
  • Columnas con una propiedad IDENTITY que genera los valores para la columna.
  • Columnas que tengan un valor predeterminado que utilice la función NEWID para generar un valor GUID exclusivo.
  • Columnas calculadas.
    Las columnas calculadas son columnas virtuales definidas como una expresión calculada a partir de una o varias columnas en la instrucción
    CREATE TABLE, como:


CREATE TABLE TestTable
  (ColA INT PRIMARY KEY,
   ColB INT NOT NULL,
   ColC AS (ColA + ColB) * 2)
En el siguiente ejemplo se muestra cómo insertar filas en una tabla con columnas que generan automáticamente un valor o tienen un valor predeterminado. La instrucción INSERT inserta filas que contienen valores para algunas de las columnas, pero no para todas. En la última instrucción INSERT, no se especifica ninguna columna y sólo se insertan los valores predeterminados.

USE AdventureWorks;
GO
IF OBJECT_ID ('dbo.T1', 'U') IS NOT NULL
    DROP TABLE dbo.T1;
GO
CREATE TABLE dbo.T1 
(
    column_1 int IDENTITY, 
    column_2 varchar(30) 
        CONSTRAINT default_name DEFAULT ('my column default'),
    column_3 timestamp,
    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
 Utilizar INSERT con la cláusula VALUE y una subconsulta SELECT
Los valores de datos suministrados deben coincidir con la lista de columnas. El número de valores de datos debe ser el mismo que el número de columnas y el tipo de datos, precisión y escala de cada valor de datos debe coincidir con los de la columna correspondiente. Puede especificar los valores de datos de la siguiente manera:
  • Mediante una cláusula VALUES para especificar los valores de datos de una fila. Por ejemplo:


INSERT INTO MyTable (PriKey, Description)
       VALUES (123, 'A description of part 123.')
Para obtener más información, vea Insertar filas mediante INSERT y VALUES.
  • Mediante una subconsulta SELECT para especificar los valores de datos para una o más filas, por ejemplo:


INSERT INTO MyTable  (PriKey, Description)
       SELECT ForeignKey, Description
       FROM SomeView
Para obtener más información, vea Insertar filas mediante subconsultas INSERT y SELECT.
 Utilizar SELECT con INTO
Para crear una tabla a partir de los valores de otra, puede usar SELECT INTO. Por ejemplo:

SELECT LastName, FirstName, Phone
INTO dbo.PhoneList492
FROM Person.Contact
WHERE Phone LIKE '492%'


Insertar filas mediante SELECT INTO
La instrucción SELECT INTO crea una nueva tabla y la llena con el conjunto de resultados de la instrucción SELECT. SELECT INTO se puede emplear para combinar datos de varias tablas o vistas en una tabla. También se puede utilizar para crear una nueva tabla que contenga datos seleccionados de un servidor vinculado.


La estructura de la nueva tabla se define con los atributos de las expresiones de la lista de selección. En el ejemplo siguiente se crea la tabla dbo.EmployeeAddresses mediante la selección de siete columnas de varias tablas relacionadas con empleados y direcciones.

USE AdventureWorks;
GO
SELECT c.FirstName, c.LastName, e.Title, a.AddressLine1, a.City, sp.Name AS [State/Province], a.PostalCode
INTO dbo.EmployeeAddresses
FROM Person.Contact AS c
JOIN HumanResources.Employee AS e ON e.ContactID = c.ContactID
JOIN HumanResources.EmployeeAddress AS ea ON ea.EmployeeID = e.EmployeeID
JOIN Person.Address AS a on a.AddressID = ea.AddressID
JOIN Person.StateProvince as sp ON sp.StateProvinceID = a.StateProvinceID;
GO
No puede usar SELECT INTO para crear una tabla con particiones, incluso si se particiona la tabla de origen. SELECT INTO no utiliza el esquema de partición de la tabla de origen. En su lugar, la nueva tabla se crea en el grupo de archivos predeterminado. Para insertar filas en una tabla con particiones, primero debe crearse la tabla con particiones y, a continuación, utilizar la instrucción INSERT INTO…SELECT FROM.
El atributo FILESTREAM no se transfiere al crear una nueva tabla mediante la instrucción SELECT INTO. Los BLOB FILESTREAM se copian y se almacenan en la nueva tabla como BLOB varbinary(max). Si un BLOB FILESTREAM supera los 2 GB, se recibe el siguiente mensaje de error y se detiene la ejecución de la instrucción: "Se ha intentado aumentar el LOB más allá del tamaño máximo permitido de 2147483647 bytes."

No hay comentarios:

Publicar un comentario