Seleccione - INTO (cláusula de Transact-SQL)

 

ESTE TEMA SE APLICA A:síSQL Server (a partir de 2008)síBase de datos SQL de AzurenoAlmacenamiento de datos SQL de Azure noAlmacenamiento de datos paralelos

SELECT...INTO crea una nueva tabla en el grupo de archivos predeterminado e inserta las filas resultantes de la consulta en ella. Para ver la sintaxis completa de SELECT, vea SELECT (Transact-SQL).

Se aplica a: SQL Server SQL Server 2008 (hasta la versión actual) Base de datos SQL de Azure.

Topic link icon Convenciones de sintaxis de Transact-SQL

  
[ INTO new_table ]  

new_table
Especifica el nombre de una nueva tabla que se va a crear en función de las columnas de la lista de selección y de las filas elegidas desde el origen de datos.

El formato de new_table se determina mediante la evaluación de las expresiones de la lista de selección. Las columnas de new_table se crean en el orden especificado por la lista de selección. Cada columna de new_table tiene el mismo nombre, tipo de datos, nulabilidad y valor que la expresión correspondiente en la lista de selección. La propiedad IDENTITY de una columna se transfiere excepto bajo las condiciones definidas en "Trabajar con columnas de identidad" en la sección Comentarios.

Para crear la tabla en otra base de datos en la misma instancia de SQL Server, especifique new_table como un nombre completo con el formato database.schema.table_name.

No se puede crear new_table en un servidor remoto; sin embargo, puede rellenar new_table desde un origen de datos remoto. Para crear new_table de una tabla de origen remoto, especifique la tabla de origen utilizando un nombre de cuatro partes con el formato servidor_vinculado.* catalog. schema. objeto* en la cláusula FROM de la instrucción SELECT. Como alternativa, puede usar el OPENQUERY función o la OPENDATASOURCE función en la cláusula FROM para especificar el origen de datos remoto.

El atributo FILESTREAM no transfiere a la nueva tabla. BLOB de FILESTREAM se copian y almacenan en la tabla nueva como varbinary (max) BLOBs. Sin el atributo FILESTREAM, el varbinary (max) tipo de datos tiene una limitación de 2 GB. Si un FILESTREAM BLOB supera este valor, se produce el error 7119 y se detiene la instrucción.

Cuando se selecciona una columna de identidad existente en una nueva tabla, la nueva columna hereda la propiedad IDENTITY, a menos que se cumpla una de las siguientes condiciones:

  • La instrucción SELECT contiene una combinación.

  • Se han combinado varias instrucciones SELECT con UNION.

  • La columna de identidad aparece más de una vez en la lista de selección.

  • La columna de identidad forma parte de una expresión.

  • La columna de identidad es de un origen de datos remoto.

Si se cumple alguna de estas condiciones, la columna se crea como NOT NULL en lugar de heredar la propiedad IDENTITY. Si una columna de identidad se requiere en la nueva tabla pero este tipo de columna no está disponible o desea un valor de inicialización o de incremento diferente de la columna de identidad de origen, defina la columna en la lista de selección utilizando la función IDENTITY. Vea "Crear una columna de identidad utilizando la función IDENTITY" en la sección Ejemplos siguiente.

No puede especificar una variable de tabla o parámetro con valores de tabla como la nueva tabla.

No puede utilizar SELECT…INTO para crear una tabla con particiones, incluso si la partición se realiza sobre la tabla de origen. SELECT...INTO no usa 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.

Los índices, restricciones y desencadenadores definidos en la tabla de origen no se transfieren a la nueva tabla, ni se pueden especificar en la instrucción SELECT...INTO. Si se requieren estos objetos, puede crearlos después de ejecutar la instrucción SELECT...INTO.

Especificar una cláusula ORDER BY no garantiza que las filas se inserten en el orden especificado.

Cuando se incluye una columna dispersa en la lista de selección, la propiedad de la columna dispersa no se transfiere a la columna de la nueva tabla. Si esta propiedad es necesaria en la nueva tabla, modifique la definición de columna después de ejecutar la instrucción SELECT...INTO para que incluya esta propiedad.

Cuando se incluye una columna calculada en la lista de selección, la columna correspondiente de la nueva tabla no es una columna calculada. Los valores de la nueva columna son los que se calcularon en el momento en que se ejecutó SELECT...INTO.

La cantidad de registro para SELECT...INTO depende del modelo de recuperación en vigor para la base de datos. En el modelo de recuperación simple o en el optimizado para cargas masivas de registros, las operaciones masivas se registran mínimamente. Con registro mínimo, con la instrucción SELECT... EN la instrucción puede ser más eficaz que crear una tabla y, a continuación, rellenar la tabla con una instrucción INSERT. Para obtener más información, vea Registro de transacciones (SQL Server).

Requiere el permiso CREATE TABLE en la base de datos de destino.

A. Crear una tabla especificando columnas de varios orígenes

En el ejemplo siguiente se crea la tabla dbo.EmployeeAddresses en la base de datos AdventureWorks2012 seleccionando siete columnas de varias tablas relacionadas con empleados y direcciones.

  
SELECT c.FirstName, c.LastName, e.JobTitle, a.AddressLine1, a.City,   
    sp.Name AS [State/Province], a.PostalCode  
INTO dbo.EmployeeAddresses  
FROM Person.Person AS c  
    JOIN HumanResources.Employee AS e   
    ON e.BusinessEntityID = c.BusinessEntityID  
    JOIN Person.BusinessEntityAddress AS bea  
    ON e.BusinessEntityID = bea.BusinessEntityID  
    JOIN Person.Address AS a  
    ON bea.AddressID = a.AddressID  
    JOIN Person.StateProvince as sp   
    ON sp.StateProvinceID = a.StateProvinceID;  
GO  
  

B. Insertar las filas utilizando el registro mínimo

El ejemplo siguiente crea la tabla dbo.NewProducts e inserta filas de la tabla Production.Product. El ejemplo supone que el modelo de recuperación de la base de datos AdventureWorks2012 está establecido en FULL. Para asegurarse de que se utiliza el registro mínimo, el modelo de recuperación de la base de datos AdventureWorks2012 se establece en BULK_LOGGED antes de que las filas se inserten y se restablece en FULL después de la instrucción SELECT...INTO. De esta manera se asegura de que la instrucción SELECT...INTO use el espacio mínimo en el registro de transacciones y funcione eficazmente.

IF OBJECT_ID('dbo.NewProducts', 'U') IS NOT NULL  
    DROP TABLE dbo.NewProducts;  
GO  
ALTER DATABASE AdventureWorks2012 SET RECOVERY BULK_LOGGED;  
GO  
  
SELECT * INTO dbo.NewProducts  
FROM Production.Product  
WHERE ListPrice > $25   
AND ListPrice < $100;  
GO  
ALTER DATABASE AdventureWorks2012 SET RECOVERY FULL;  
GO  

C. Crear una columna de identidad utilizando la función IDENTITY

En el ejemplo siguiente se utiliza la función IDENTITY para crear una columna de identidad en la nueva tabla Person.USAddress de la base de datos AdventureWorks2012. Se requiere esto porque la instrucción SELECT que define la tabla contiene una unión, que hace que la propiedad IDENTITY no transfiera a la nueva tabla. Tenga en cuenta que los valores de inicialización e incremento especificados en la función IDENTITY son diferentes de los de la columna AddressID de la tabla de origen Person.Address.

  
IF OBJECT_ID ('Person.USAddress') IS NOT NULL  
DROP TABLE Person.USAddress;  
GO  
-- Determine the IDENTITY status of the source column AddressID.  
SELECT OBJECT_NAME(object_id) AS TableName, name AS column_name, is_identity, seed_value, increment_value  
FROM sys.identity_columns  
WHERE name = 'AddressID';  
  
-- Create a new table with columns from the existing table Person.Address. A new IDENTITY  
-- column is created by using the IDENTITY function.  
SELECT IDENTITY (int, 100, 5) AS AddressID,   
       a.AddressLine1, a.City, b.Name AS State, a.PostalCode  
INTO Person.USAddress   
FROM Person.Address AS a  
INNER JOIN Person.StateProvince AS b ON a.StateProvinceID = b.StateProvinceID  
WHERE b.CountryRegionCode = N'US';   
  
-- Verify the IDENTITY status of the AddressID columns in both tables.  
SELECT OBJECT_NAME(object_id) AS TableName, name AS column_name, is_identity, seed_value, increment_value  
FROM sys.identity_columns  
WHERE name = 'AddressID';  
  

D. Crear una tabla especificando las columnas de un origen de datos remoto

El ejemplo siguiente muestra tres métodos para crear una nueva tabla en el servidor local desde un origen de datos remoto. En el ejemplo se comienza creando un vínculo al origen de datos remoto. El nombre del servidor vinculado, MyLinkServer, se especifica en la cláusula FROM de la primera instrucción SELECT...INTO y en la función OPENQUERY de la segunda instrucción SELECT...INTO. La tercera instrucción SELECT...INTO utiliza la función OPENDATASOURCE, que especifica el origen de datos remoto directamente en lugar de utilizar el nombre del servidor vinculado.

Se aplica a: SQL Server 2008 a través de SQL Server 2016.

USE master;  
GO  
-- Create a link to the remote data source.   
-- Specify a valid server name for @datasrc as 'server_name' or 'server_name\instance_name'.  
EXEC sp_addlinkedserver @server = N'MyLinkServer',  
    @srvproduct = N' ',  
    @provider = N'SQLNCLI',   
    @datasrc = N'server_name',  
    @catalog = N'AdventureWorks2012';  
GO  
USE AdventureWorks2012;  
GO  
-- Specify the remote data source in the FROM clause using a four-part name   
-- in the form linked_server.catalog.schema.object.  
SELECT DepartmentID, Name, GroupName, ModifiedDate  
INTO dbo.Departments  
FROM MyLinkServer.AdventureWorks2012.HumanResources.Department  
GO  
-- Use the OPENQUERY function to access the remote data source.  
SELECT DepartmentID, Name, GroupName, ModifiedDate  
INTO dbo.DepartmentsUsingOpenQuery  
FROM OPENQUERY(MyLinkServer, 'SELECT *  
               FROM AdventureWorks2012.HumanResources.Department');   
GO  
-- 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_name\instance_name.  
SELECT DepartmentID, Name, GroupName, ModifiedDate  
INTO dbo.DepartmentsUsingOpenDataSource  
FROM OPENDATASOURCE('SQLNCLI',  
    'Data Source=server_name;Integrated Security=SSPI')  
    .AdventureWorks2012.HumanResources.Department;  
GO  

E. Importar desde una tabla externa que se creó con PolyBase

Importe datos desde Almacenamiento de Azure o Hadoop en SQL Server para obtener un almacenamiento persistente. Use SELECT INTO para importar datos al que hace referencia en una tabla externa para el almacenamiento persistente en SQL Server. Cree una tabla relacional sobre la marcha y luego cree un índice de almacén de columnas sobre la tabla en un segundo paso.

Se aplica a: SQL Server 2016.

-- Import data for car drivers into SQL Server to do more in-depth analysis.  
SELECT DISTINCT   
        Insured_Customers.FirstName, Insured_Customers.LastName,   
        Insured_Customers.YearlyIncome, Insured_Customers.MaritalStatus  
INTO Fast_Customers from Insured_Customers INNER JOIN   
(  
        SELECT * FROM CarSensor_Data where Speed > 35   
) AS SensorD  
ON Insured_Customers.CustomerKey = SensorD.CustomerKey  
ORDER BY YearlyIncome  
  

SELECT (Transact-SQL)
Seleccionar ejemplos (Transact-SQL)
INSERT (Transact-SQL)
IDENTITY (función) (Transact-SQL)

Adiciones de comunidad

AGREGAR
Mostrar: