INTO (cláusula de Transact-SQL)

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).

Icono de vínculo a temasConvenciones de sintaxis de Transact-SQL

Sintaxis

[ INTO new_table ]

Argumentos

  • 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 que especifica 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 de 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 Notas.

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

    No puede crear new_table en un servidor remoto; sin embargo, puede rellenar new_table desde un origen de datos remoto. Para crear new_table a partir de una tabla de origen remota, especifique la tabla de origen utilizando un nombre con cuatro partes con el formato servidor_vinculado.catálogo.esquema.objeto en la cláusula FROM de la instrucción SELECT. También puede utilizar la función OPENQUERY o la función OPENDATASOURCE en la cláusula FROM para especificar el origen de datos remoto.

Tipos de datos

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, una cláusula GROUP BY o una función de agregado.

  • 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.

Limitaciones y restricciones

Las limitaciones y restricciones siguientes se aplican a la cláusula INTO:

  • 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.

  • 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.

  • No se puede usar SELECT...INTO con COMPUTE.

  • El atributo FILESTREAM no transfiere a la nueva tabla. Los BLOB FILESTREAM se copian y se almacenan en la nueva tabla como BLOB varbinary(max). Sin el atributo FILESTREAM, el tipo de datos varbinary(max) 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.

  • 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, debe crearlos después de ejecutar SELECT...INTO.

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

Comportamiento del registro

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, utilizar la instrucción SELECT… INTO puede ser más eficaz que crear una tabla y rellenarla con una instrucción INSERT. Para obtener más información, vea Operaciones que pueden ser registradas mínimamente.

Permisos

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

Ejemplos

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

En el ejemplo siguiente se crea la tabla dbo.EmployeeAddresses seleccionando 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

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 AdventureWorks está establecido en FULL. Para asegurarse de que se utiliza el registro mínimo, el modelo de recuperación de la base de datos AdventureWorks 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.

USE AdventureWorks;
GO
IF OBJECT_ID ('dbo.NewProducts', 'U') IS NOT NULL
    DROP TABLE dbo.NewProducts;
GO
ALTER DATABASE AdventureWorks SET RECOVERY BULK_LOGGED;
GO

SELECT * INTO dbo.NewProducts
FROM Production.Product
WHERE ListPrice > $25 
AND ListPrice < $100;
GO
ALTER DATABASE AdventureWorks 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. 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.

USE AdventureWorks;
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.

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'AdventureWorks';
GO
USE AdventureWorks;
GO
-- Specify the remote data source in the FROM clause using a four-part name 
-- in the form linked_server.catalog.schema.object.
SELECT *
INTO dbo.Departments
FROM MyLinkServer.AdventureWorks.HumanResources.Department
GO
-- Use the OPENQUERY function to access the remote data source.
SELECT *
INTO dbo.DepartmentsUsingOpenQuery
FROM OPENQUERY(MyLinkServer, 'SELECT *
               FROM AdventureWorks.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 *
INTO dbo.DepartmentsUsingOpenDataSource
FROM OPENDATASOURCE('SQLNCLI',
    'Data Source=server_name;Integrated Security=SSPI')
    .AdventureWorks.HumanResources.Department;
GO