SELECT: cláusula INTO (Transact-SQL)SELECT - INTO Clause (Transact-SQL)

SE APLICA A: síSQL Server síAzure SQL Database síAzure SQL Data Warehouse síAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

SELECT…INTO crea una tabla en el grupo de archivos predeterminado e inserta las filas resultantes de la consulta en ella.SELECT...INTO creates a new table in the default filegroup and inserts the resulting rows from the query into it. Para conocer la sintaxis completa de SELECT, vea SELECT (Transact-SQL).To view the complete SELECT syntax, see SELECT (Transact-SQL).

Icono de vínculo de tema Convenciones de sintaxis de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxisSyntax

[ INTO new_table ]
[ ON filegroup ]

ArgumentosArguments

tabla_nueva 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.Specifies the name of a new table to be created, based on the columns in the select list and the rows chosen from the data source.

El formato de new_table se determina mediante la evaluación de las expresiones de la lista de selección.The format of new_table is determined by evaluating the expressions in the select list. Las columnas de new_table se crean en el orden que especifica la lista de selección.The columns in new_table are created in the order specified by the select list. 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.Each column in new_table has the same name, data type, nullability, and value as the corresponding expression in the select list. La propiedad IDENTITY de una columna se transfiere excepto bajo las condiciones definidas en "Trabajar con columnas de identidad" en la sección Comentarios.The IDENTITY property of a column is transferred except under the conditions defined in "Working with Identity Columns" in the Remarks section.

Para crear la tabla en otra base de datos en la misma instancia de SQL ServerSQL Server, especifique new_table como un nombre completo con formato database.schema.table_name.To create the table in another database on the same instance of SQL ServerSQL Server, specify new_table as a fully qualified name in the form database.schema.table_name.

No se puede crear new_table en un servidor remoto, pero se puede rellenar new_table desde un origen de datos remoto.You cannot create new_table on a remote server; however, you can populate new_table from a remote data source. Para crear new_table a partir de una tabla de origen remota, especifique la tabla de origen mediante un nombre con cuatro partes con el formato linked_server.catalog.schema.object en la cláusula FROM de la instrucción SELECT.To create new_table from a remote source table, specify the source table using a four-part name in the form linked_server.catalog.schema.object in the FROM clause of the SELECT statement. También puede usar la función OPENQUERY o la función OPENDATASOURCE en la cláusula FROM para especificar el origen de datos remoto.Alternatively, you can use the OPENQUERY function or the OPENDATASOURCE function in the FROM clause to specify the remote data source.

grupo_de_archivos filegroup
Especifica el nombre del grupo de archivos en el que se creará la tabla.Specifies the name of the filegroup in which new table will be created. El grupo de archivos especificado debe existir en la base de datos; de lo contrario, se mostrará un error en el motor de SQL Server.The filegroup specified should exist on the database else the SQL Server engine throws an error.

Se aplica a: SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP2 a SQL Server 2017SQL Server 2017.Applies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP2 through SQL Server 2017SQL Server 2017.

Tipos de datosData Types

El atributo FILESTREAM no transfiere a la nueva tabla.The FILESTREAM attribute does not transfer to the new table. Los BLOB FILESTREAM se copian y se almacenan en la nueva tabla como BLOB varbinary(max) .FILESTREAM BLOBs are copied and stored in the new table as varbinary(max) BLOBs. Sin el atributo FILESTREAM, el tipo de datos varbinary(max) tiene una limitación de 2 GB.Without the FILESTREAM attribute, the varbinary(max) data type has a limitation of 2 GB. Si un FILESTREAM BLOB supera este valor, se produce el error 7119 y se detiene la instrucción.If a FILESTREAM BLOB exceeds this value, error 7119 is raised and the statement is stopped.

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:When an existing identity column is selected into a new table, the new column inherits the IDENTITY property, unless one of the following conditions is true:

  • La instrucción SELECT contiene una combinación.The SELECT statement contains a join.

  • Se han combinado varias instrucciones SELECT con UNION.Multiple SELECT statements are joined by using UNION.

  • La columna de identidad aparece más de una vez en la lista de selección.The identity column is listed more than one time in the select list.

  • La columna de identidad forma parte de una expresión.The identity column is part of an expression.

  • La columna de identidad es de un origen de datos remoto.The identity column is from a remote data source.

Si se cumple alguna de estas condiciones, la columna se crea como NOT NULL en lugar de heredar la propiedad IDENTITY.If any one of these conditions is true, the column is created NOT NULL instead of inheriting the IDENTITY property. 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.If an identity column is required in the new table but such a column is not available, or you want a seed or increment value that is different than the source identity column, define the column in the select list using the IDENTITY function. Vea "Crear una columna de identidad utilizando la función IDENTITY" en la sección Ejemplos siguiente.See "Creating an identity column using the IDENTITY function" in the Examples section below.

NotasRemarks

El funcionamiento de la instrucción SELECT...INTO consta de dos pasos: se crea la tabla y, después, se insertan filas.The SELECT...INTO statement operates in two parts - the new table is created, and then rows are inserted. Esto significa que si se produce un error en las operaciones de inserción, se revertirán todas, pero la tabla nueva (vacía) se conservará.This means that if the inserts fail, they will all be rolled back, but the new (empty) table will remain. Si necesita que la operación sea correcta o no en su totalidad, use una transacción explícita.If you need the entire operation to succeed or fail as a whole, use an explicit transaction.

Limitaciones y restriccionesLimitations and Restrictions

No puede especificar una variable de tabla o parámetro con valores de tabla como la nueva tabla.You cannot specify a table variable or table-valued parameter as the new table.

No puede se usar SELECT...INTO para crear una tabla con particiones, incluso si la partición se realiza sobre la tabla de origen.You cannot use SELECT...INTO to create a partitioned table, even when the source table is partitioned. En SELECT...INTO no se usa el esquema de partición de la tabla de origen; en su lugar, la tabla nueva se crea en el grupo de archivos predeterminado.SELECT...INTO does not use the partition scheme of the source table; instead, the new table is created in the default filegroup. Para insertar filas en una tabla con particiones, primero se debe crear la tabla con particiones y, después, usar la instrucción INSERT INTO...SELECT...FROM.To insert rows into a partitioned table, you must first create the partitioned table and then use the INSERT INTO...SELECT...FROM statement.

Los índices, restricciones y desencadenadores definidos en la tabla de origen no se transfieren a la tabla nueva, ni se pueden especificar en la instrucción SELECT...INTO.Indexes, constraints, and triggers defined in the source table are not transferred to the new table, nor can they be specified in the SELECT...INTO statement. Si se requieren estos objetos, se pueden crear después de ejecutar la instrucción SELECT...INTO.If these objects are required, you can create them after executing the SELECT...INTO statement.

Especificar una cláusula ORDER BY no garantiza que las filas se inserten en el orden especificado.Specifying an ORDER BY clause does not guarantee the rows are inserted in the specified order.

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.When a sparse column is included in the select list, the sparse column property does not transfer to the column in the new table. 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.If this property is required in the new table, alter the column definition after executing the SELECT...INTO statement to include this property.

Cuando se incluye una columna calculada en la lista de selección, la columna correspondiente de la nueva tabla no es una columna calculada.When a computed column is included in the select list, the corresponding column in the new table is not a computed column. Los valores de la columna nueva son los que se calcularon en el momento en que se ejecutó SELECT...INTO.The values in the new column are the values that were computed at the time SELECT...INTO was executed.

Comportamiento del registroLogging Behavior

La cantidad de registro para SELECT...INTO depende del modelo de recuperación en vigor para la base de datos.The amount of logging for SELECT...INTO depends on the recovery model in effect for the database. En el modelo de recuperación simple o en el optimizado para cargas masivas de registros, las operaciones masivas se registran mínimamente.Under the simple recovery model or bulk-logged recovery model, bulk operations are minimally logged. Con registro mínimo, el uso de la instrucción SELECT...INTO puede ser más eficaz que crear una tabla y rellenarla después con una instrucción INSERT.With minimal logging, using the SELECT...INTO statement can be more efficient than creating a table and then populating the table with an INSERT statement. Para más información, consulte El registro de transacciones (SQL Server).For more information, see The Transaction Log (SQL Server).

PermisosPermissions

Requiere el permiso CREATE TABLE en la base de datos de destino.Requires CREATE TABLE permission in the destination database.

EjemplosExamples

A.A. Crear una tabla especificando columnas de varios orígenesCreating a table by specifying columns from multiple sources

En el ejemplo siguiente se crea la tabla dbo.EmployeeAddresses en la base de datos AdventureWorks2012AdventureWorks2012 seleccionando siete columnas de varias tablas relacionadas con empleados y direcciones.The following example creates the table dbo.EmployeeAddresses in the AdventureWorks2012AdventureWorks2012 database by selecting seven columns from various employee-related and address-related tables.

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.B. Insertar las filas utilizando el registro mínimoInserting rows using minimal logging

El ejemplo siguiente crea la tabla dbo.NewProducts e inserta filas de la tabla Production.Product.The following example creates the table dbo.NewProducts and inserts rows from the Production.Product table. El ejemplo supone que el modelo de recuperación de la base de datos AdventureWorks2012AdventureWorks2012 está establecido en FULL.The example assumes that the recovery model of the AdventureWorks2012AdventureWorks2012 database is set to FULL. Para asegurarse de que se utiliza el registro mínimo, el modelo de recuperación de la base de datos AdventureWorks2012AdventureWorks2012 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.To ensure minimal logging is used, the recovery model of the AdventureWorks2012AdventureWorks2012 database is set to BULK_LOGGED before rows are inserted and reset to FULL after the SELECT...INTO statement. 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.This process ensures that the SELECT...INTO statement uses minimal space in the transaction log and performs efficiently.

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.C. Crear una columna de identidad utilizando la función IDENTITYCreating an identity column using the IDENTITY function

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 AdventureWorks2012AdventureWorks2012.The following example uses the IDENTITY function to create an identity column in the new table Person.USAddress in the AdventureWorks2012AdventureWorks2012 database. 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.This is required because the SELECT statement that defines the table contains a join, which causes the IDENTITY property to not transfer to the new table. 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.Notice that the seed and increment values specified in the IDENTITY function are different from those of the AddressID column in the source table Person.Address.

-- 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.D. Crear una tabla especificando las columnas de un origen de datos remotoCreating a table by specifying columns from a remote data source

El ejemplo siguiente muestra tres métodos para crear una nueva tabla en el servidor local desde un origen de datos remoto.The following example demonstrates three methods of creating a new table on the local server from a remote data source. En el ejemplo se comienza creando un vínculo al origen de datos remoto.The example begins by creating a link to the remote data source. 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.The linked server name, MyLinkServer, is then specified in the FROM clause of the first SELECT...INTO statement and in the OPENQUERY function of the second SELECT...INTO statement. 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.The third SELECT...INTO statement uses the OPENDATASOURCE function, which specifies the remote data source directly instead of using the linked server name.

Se aplica a: de SQL Server 2008SQL Server 2008 a SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

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.E. Importar desde una tabla externa creada con PolyBaseImport from an external table created with PolyBase

Importe datos desde Almacenamiento de Azure o Hadoop en SQL Server para obtener un almacenamiento persistente.Import data from Hadoop or Azure Storage into SQL Server for persistent storage. Use SELECT INTO para importar datos a los que se hace referencia en una tabla externa para el almacenamiento persistente en SQL Server.Use SELECT INTO to import data referenced by an external table for persistent storage in 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.Create a relational table on-the-fly and then create a column-store index on top of the table in a second step.

Se aplica a: SQL Server 2017SQL Server 2017.Applies to: SQL Server 2017SQL Server 2017.

-- 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;  

F.F. Crear una tabla como una copia de otra tabla y cargarla en un grupo de archivos especificadoCreating a new table as a copy of another table and loading it a specified filegroup

En el ejemplo siguiente se muestra cómo crear una tabla como una copia de otra tabla y cargarla en un grupo de archivos especificado diferente del grupo de archivos predeterminado del usuario.The following example demonstrates creating a new table as a copy of another table and loading it into a specified filegroup different from the default filegroup of the user.

Se aplica a: SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP2 a SQL Server 2017SQL Server 2017.Applies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP2 through SQL Server 2017SQL Server 2017.

ALTER DATABASE [AdventureWorksDW2016] ADD FILEGROUP FG2;
ALTER DATABASE [AdventureWorksDW2016]
ADD FILE
(
NAME='FG2_Data',
FILENAME = '/var/opt/mssql/data/AdventureWorksDW2016_Data1.mdf'
)
TO FILEGROUP FG2;
GO
SELECT * INTO [dbo].[FactResellerSalesXL] ON FG2 FROM [dbo].[FactResellerSales];

Consulte tambiénSee Also

SELECT (Transact-SQL) SELECT (Transact-SQL)
Ejemplos de SELECT (Transact-SQL) SELECT Examples (Transact-SQL)
INSERT (Transact-SQL) INSERT (Transact-SQL)
IDENTITY (Function) (Transact-SQL)IDENTITY (Function) (Transact-SQL)