SELECT – Cláusula INTO (Transact-SQL)SELECT - INTO Clause (Transact-SQL)

APLICA-SE A: simSQL Server simBanco de Dados SQL do Azure simSQL Data Warehouse do Azure simParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

SELECT…INTO cria uma tabela no grupo de arquivos padrão e insere nela as linhas resultantes da consulta.SELECT...INTO creates a new table in the default filegroup and inserts the resulting rows from the query into it. Para exibir a sintaxe completa de SELECT, confira SELECT (Transact-SQL).To view the complete SELECT syntax, see SELECT (Transact-SQL).

Ícone de link do tópico Convenções de sintaxe de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxeSyntax

[ INTO new_table ]
[ ON filegroup ]

ArgumentosArguments

new_table new_table
Especifica o nome de uma nova tabela a ser criada com base nas colunas da lista de seleção e nas linhas escolhidas na origem dos dados.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.

O formato de new_table é determinado pela avaliação das expressões na lista de seleção.The format of new_table is determined by evaluating the expressions in the select list. As colunas na new_table são criadas na ordem especificada pela lista de seleção.The columns in new_table are created in the order specified by the select list. Cada coluna em new_table tem o mesmo nome, tipo de dados, nulidade e valor que a expressão correspondente na lista de seleção.Each column in new_table has the same name, data type, nullability, and value as the corresponding expression in the select list. A propriedade IDENTITY de uma coluna é transferida, exceto nas condições definidas em "Trabalhando com colunas de identidade", na seção Comentários.The IDENTITY property of a column is transferred except under the conditions defined in "Working with Identity Columns" in the Remarks section.

Para criar a tabela em outro banco de dados na mesma instância do SQL ServerSQL Server, especifique new_table como um nome totalmente qualificado no 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.

Não é possível criar new_table em um servidor remoto. No entanto, você pode popular new_table de uma fonte de dados remota.You cannot create new_table on a remote server; however, you can populate new_table from a remote data source. Para criar new_table de uma tabela de origem remota, especifique a tabela de origem usando um nome de quatro partes no formato linked_server.catálogo.esquema.objeto na cláusula FROM da instrução 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. Como alternativa, é possível usar a função OPENQUERY ou a função OPENDATASOURCE na cláusula FROM para especificar a fonte de dados remota.Alternatively, you can use the OPENQUERY function or the OPENDATASOURCE function in the FROM clause to specify the remote data source.

filegroup filegroup
Especifica o nome do grupo de arquivos no qual a nova tabela será criada.Specifies the name of the filegroup in which new table will be created. O grupo de arquivos especificado deverá existir no banco de dados, caso contrário, o mecanismo do SQL Server gerará um erro.The filegroup specified should exist on the database else the SQL Server engine throws an error.

Aplica-se 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 dadosData Types

O atributo FILESTREAM não é transferido para a nova tabela.The FILESTREAM attribute does not transfer to the new table. Os BLOBs do FILESTREAM são copiados e armazenados na nova tabela como BLOBs varbinary(max) .FILESTREAM BLOBs are copied and stored in the new table as varbinary(max) BLOBs. Sem o atributo FILESTREAM, o tipo de dados varbinary(max) tem uma limitação de 2 GB.Without the FILESTREAM attribute, the varbinary(max) data type has a limitation of 2 GB. Se um FILESTREAM BLOB exceder esse valor, ocorrerá o erro 7119, e a instrução será interrompida.If a FILESTREAM BLOB exceeds this value, error 7119 is raised and the statement is stopped.

Quando uma coluna de identidade existente é seleciona para uma nova tabela, a nova coluna herda a propriedade IDENTITY, a menos que uma das seguintes condições seja verdadeira: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:

  • A instrução SELECT contém uma junção.The SELECT statement contains a join.

  • Várias instruções SELECT são unidas usando UNION.Multiple SELECT statements are joined by using UNION.

  • A coluna de identidade é listada mais de uma vez na lista de seleção.The identity column is listed more than one time in the select list.

  • A coluna de identidade faz parte de uma expressão.The identity column is part of an expression.

  • A coluna de identidade provém de uma fonte de dados remota.The identity column is from a remote data source.

Se alguma dessas condições for verdadeira, a coluna será criada como NOT NULL em vez de herdar a propriedade IDENTITY.If any one of these conditions is true, the column is created NOT NULL instead of inheriting the IDENTITY property. Se uma coluna de identidade for obrigatória na nova tabela, mas não estiver disponível, ou se você desejar um valor de semente ou de incremento diferente da coluna de identidade de origem, defina a coluna na lista de seleção que usa a função 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. Consulte "Criando uma coluna de identidade usando a função IDENTITY" na seção Exemplos abaixo.See "Creating an identity column using the IDENTITY function" in the Examples section below.

RemarksRemarks

A instrução SELECT...INTO opera em duas partes – a nova tabela é criada e, em seguida, as linhas são inseridas.The SELECT...INTO statement operates in two parts - the new table is created, and then rows are inserted. Isso significa que, se as inserções falharem, elas serão todas revertidas, mas a nova tabela (vazia) permanecerá.This means that if the inserts fail, they will all be rolled back, but the new (empty) table will remain. Se você precisar que toda a operação tenha êxito ou falhe como um todo, use uma transação explícita.If you need the entire operation to succeed or fail as a whole, use an explicit transaction.

Limitações e RestriçõesLimitations and Restrictions

Não é possível especificar uma variável de tabela ou um parâmetro com valor de tabela como a nova tabela.You cannot specify a table variable or table-valued parameter as the new table.

Você não pode usar SELECT...INTO para criar uma tabela particionada, mesmo quando a tabela de origem está particionada.You cannot use SELECT...INTO to create a partitioned table, even when the source table is partitioned. SELECT...INTO não usa o esquema de partição da tabela de origem; em vez disso, a nova tabela é criada no grupo de arquivos padrão.SELECT...INTO does not use the partition scheme of the source table; instead, the new table is created in the default filegroup. Para inserir linhas em uma tabela particionada, crie primeiro a tabela particionada e depois use a instrução 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.

Índices, restrições e gatilhos definidos na tabela de origem não são transferidos para a nova tabela, nem podem ser especificados na instrução 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. Se esses objetos forem obrigatórios, você poderá criá-los depois de executar a instrução SELECT...INTO.If these objects are required, you can create them after executing the SELECT...INTO statement.

Especificar uma cláusula ORDER BY não garante que as linhas sejam inseridas na ordem especificada.Specifying an ORDER BY clause does not guarantee the rows are inserted in the specified order.

Quando uma coluna esparsa é incluída na lista de seleção, a propriedade da coluna esparsa não é transferida para a coluna na nova tabela.When a sparse column is included in the select list, the sparse column property does not transfer to the column in the new table. Se essa propriedade for necessária na nova tabela, altere a definição de coluna depois de executar a instrução SELECT... INTO para incluir essa propriedade.If this property is required in the new table, alter the column definition after executing the SELECT...INTO statement to include this property.

Quando uma coluna computada é incluída na lista de seleção, a coluna correspondente na nova tabela não é uma coluna computada.When a computed column is included in the select list, the corresponding column in the new table is not a computed column. Os valores na nova coluna são os que foram calculados no momento em que a SELECT...INTO foi executada.The values in the new column are the values that were computed at the time SELECT...INTO was executed.

Comportamento de logLogging Behavior

A quantidade de registro em log para SELECT...INTO depende do modelo de recuperação em vigor para o banco de dados.The amount of logging for SELECT...INTO depends on the recovery model in effect for the database. Nos modelos de recuperação simples ou bulk-logged, as operações em massa são registradas minimamente.Under the simple recovery model or bulk-logged recovery model, bulk operations are minimally logged. Com o log mínimo, usar a instrução SELECT...INTO pode ser mais eficiente do que criar uma tabela e então preenchê-la usando uma instrução 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 obter mais informações, consulte O log de transações (SQL Server).For more information, see The Transaction Log (SQL Server).

PermissõesPermissions

Exige permissão CREATE DATABASE no banco de dados de destino.Requires CREATE TABLE permission in the destination database.

ExemplosExamples

A.A. Criando uma tabela especificando colunas de várias origensCreating a table by specifying columns from multiple sources

O exemplo a seguir cria a tabela dbo.EmployeeAddresses no banco de dados AdventureWorks2012AdventureWorks2012 selecionando sete colunas de várias tabelas relacionadas a funcionários e endereços.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. Inserindo linhas usando log mínimoInserting rows using minimal logging

O exemplo a seguir cria a tabela dbo.NewProducts e insere linhas da tabela Production.Product.The following example creates the table dbo.NewProducts and inserts rows from the Production.Product table. O exemplo pressupõe que o modelo de recuperação do banco de dados AdventureWorks2012AdventureWorks2012 esteja definido como FULL.The example assumes that the recovery model of the AdventureWorks2012AdventureWorks2012 database is set to FULL. Para assegurar um log mínimo, o modelo de recuperação do banco de dados AdventureWorks2012AdventureWorks2012 é definido como BULK_LOGGED antes da inserção das linhas e redefinido como FULL após a instrução 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. Esse processo garante que a instrução SELECT... INTO use um espaço mínimo no log de transações e seja executada de forma eficiente.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. Criando uma coluna de identidade usando a função IDENTITYCreating an identity column using the IDENTITY function

O exemplo a seguir usa a função IDENTITY para criar uma coluna de identidade na nova tabela Person.USAddress no banco de dados AdventureWorks2012AdventureWorks2012.The following example uses the IDENTITY function to create an identity column in the new table Person.USAddress in the AdventureWorks2012AdventureWorks2012 database. Isso é necessário porque a instrução SELECT que define a tabela contém uma junção; por isso, a propriedade IDENTITY não é transferida para a nova tabela.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. Observe que os valores de semente e incremento especificados na função IDENTITY são diferentes dos valores da coluna AddressID na tabela de origem 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. Criando uma tabela especificando colunas de uma fonte de dados remotosCreating a table by specifying columns from a remote data source

O seguinte exemplo demonstra três métodos para criar uma nova tabela no servidor local de uma fonte de dados remota.The following example demonstrates three methods of creating a new table on the local server from a remote data source. O exemplo começa criando um link para a fonte de dados remota.The example begins by creating a link to the remote data source. O nome do servidor vinculado, MyLinkServer,, é especificado na cláusula FROM da primeira instrução SELECT...INTO e na função OPENQUERY da segunda instrução 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. A terceira instrução SELECT... INTO usa a função OPENDATASOURCE, que especifica a fonte de dados remota diretamente, em vez de usar o nome de 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.

Aplica-se a: 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 de uma tabela externa criada com PolyBaseImport from an external table created with PolyBase

Importe dados do Hadoop ou armazenamento do Azure para SQL Server, para armazenamento persistente.Import data from Hadoop or Azure Storage into SQL Server for persistent storage. Use SELECT INTO para importar os dados referenciados por uma tabela externa para o armazenamento persistente no SQL Server.Use SELECT INTO to import data referenced by an external table for persistent storage in SQL Server. Crie uma tabela relacional rapidamente e, em seguida, crie um índice de repositório de coluna sobre a tabela em uma segunda etapa.Create a relational table on-the-fly and then create a column-store index on top of the table in a second step.

Aplica-se ao: 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. Criando uma nova tabela como uma cópia de outra tabela e carregando-a em um grupo de arquivos especificadoCreating a new table as a copy of another table and loading it a specified filegroup

O exemplo a seguir demonstra a criação de uma nova tabela como uma cópia de outra tabela e seu carregamento em um grupo de arquivos especificado diferente do grupo de arquivos padrão do usuário.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.

Aplica-se 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 TambémSee Also

SELECT (Transact-SQL) SELECT (Transact-SQL)
Exemplos de SELECT (Transact-SQL) SELECT Examples (Transact-SQL)
INSERT (Transact-SQL) INSERT (Transact-SQL)
IDENTITY (função) (Transact-SQL)IDENTITY (Function) (Transact-SQL)