SELECT: cláusula INTO (Transact-SQL)
Se aplica a: SQL Server Azure SQL Database Azure SQL Instancia administrada Azure Synapse Analytics Analytics Platform System (PDW) Warehouse en microsoft Fabric SQL Database en Microsoft Fabric
SELECT…INTO crea una tabla en el grupo de archivos predeterminado e inserta las filas resultantes de la consulta en ella. Para conocer la sintaxis completa de SELECT, vea SELECT (Transact-SQL).
Convenciones de sintaxis de Transact-SQL
Sintaxis
[ INTO new_table ]
[ ON filegroup ]
Argumentos
tabla_nueva
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 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 formato 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. 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. 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.
grupo_de_archivos
Especifica el nombre del grupo de archivos en el que se creará la tabla. 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.
Se aplica a: SQL Server 2016 (13.x) SP2 y versiones posteriores
Tipo de datos
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.
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.
Observaciones
El funcionamiento de la instrucción SELECT...INTO
consta de dos pasos: se crea la tabla y, después, se insertan filas. 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á. Si necesita que la operación sea correcta o no en su totalidad, use una transacción explícita.
El almacenamiento de Microsoft Fabric no admite grupos de archivos. Las referencias y ejemplos de este artículo a los grupos de archivos no se aplican al almacenamiento de Microsoft Fabric.
Limitaciones y restricciones
No puede especificar una variable de tabla o parámetro con valores de tabla como la nueva tabla.
No puede se usar SELECT...INTO
para crear una tabla con particiones, incluso si la partición se realiza sobre la tabla de origen. 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. 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
.
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
. Si se requieren estos objetos, se pueden crear 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 columna nueva son los que se calcularon en el momento en que se ejecutó SELECT...INTO
.
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, 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. Para más información, consulte El registro de transacciones (SQL Server).
Las instrucciones SELECT...INTO
que contiene funciones definidas por el usuario (UDF) son operaciones que se registran por completo. Si las funciones definidas por el usuario que se utilizan en la instrucción SELECT...INTO
no realizan ninguna operación de acceso a datos, puede especificar la cláusula SCHEMABINDING para las funciones definidas por el usuario, lo que establecerá la propiedad UserDataAccess derivada para dichas funciones en 0. Después de este cambio, las instrucciones SELECT...INTO
se registrarán de forma mínima. Si la instrucción SELECT...INTO
sigue haciendo referencia a al menos una función definida por el usuario con esta propiedad establecida en 1, la operación se registrará por completo.
Permisos
Se necesita el permiso CREATE TABLE en la base de datos y el permiso ALTER en el esquema en que se crea la tabla.
Ejemplos
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 AdventureWorks2022 mediante la selección de 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
. En el ejemplo se supone que el modelo de recuperación de la base de datos AdventureWorks2022 está establecido en FULL. Para asegurarse de que se utiliza el registro mínimo, el modelo de recuperación de la base de datos AdventureWorks2022 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.
ALTER DATABASE AdventureWorks2022 SET RECOVERY BULK_LOGGED;
GO
SELECT * INTO dbo.NewProducts
FROM Production.Product
WHERE ListPrice > $25
AND ListPrice < $100;
GO
ALTER DATABASE AdventureWorks2022 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 AdventureWorks2022. 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
.
-- 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 (10.0.x) y versiones posteriores.
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'AdventureWorks2022';
GO
USE AdventureWorks2022;
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.AdventureWorks2022.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 AdventureWorks2022.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')
.AdventureWorks2022.HumanResources.Department;
GO
E. Importar desde una tabla externa creada con PolyBase
Importe datos desde Almacenamiento de Azure o Hadoop en SQL Server para obtener un almacenamiento persistente. Use SELECT INTO
para importar datos a los que se 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.
-- 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. Copia de los datos de una tabla en otra y creación de la tabla en un grupo de archivos especificado
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.
Se aplica a: SQL Server 2016 (13.x) SP2 y versiones posteriores
ALTER DATABASE [AdventureWorksDW2022] ADD FILEGROUP FG2;
ALTER DATABASE [AdventureWorksDW2022]
ADD FILE
(
NAME='FG2_Data',
FILENAME = '/var/opt/mssql/data/AdventureWorksDW2022_Data1.mdf'
)
TO FILEGROUP FG2;
GO
SELECT * INTO [dbo].[FactResellerSalesXL] ON FG2 FROM [dbo].[FactResellerSales];
Consulte también
SELECT (Transact-SQL)
Ejemplos de SELECT (Transact-SQL)
INSERT (Transact-SQL)
IDENTITY (Función) (Transact-SQL)