Partilhar via


Cláusula SELECT - INTO (Transact-SQL)

Aplica-se a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSistema de Plataforma de Análise (PDW)Armazém no Microsoft FabricBase de dados SQL no Microsoft Fabric

SELECIONAR... O INTO cria uma nova tabela no grupo de arquivos padrão e insere as linhas resultantes da consulta nela. Para visualizar a sintaxe SELECT completa, consulte SELECT (Transact-SQL).

Transact-SQL convenções de sintaxe

Syntax

[ INTO new_table ]
[ ON filegroup ]

Arguments

new_table
Especifica o nome de uma nova tabela a ser criada, com base nas colunas na lista de seleção e nas linhas escolhidas da fonte de dados.

O formato do new_table é determinado pela avaliação das expressões na lista de seleção. As colunas em new_table são criadas na ordem especificada pela lista de seleção. Cada coluna no new_table tem o mesmo nome, tipo de dados, anulabilidade e valor que a expressão correspondente na lista de seleção. A propriedade IDENTITY de uma coluna é transferida, exceto sob as condições definidas em "Trabalhando com colunas de identidade" na seção Comentários.

Para criar a tabela em outro banco de dados na mesma instância do SQL Server, especifique new_table como um nome totalmente qualificado no formato database.schema.table_name.

Não é possível criar new_table em um servidor remoto; no entanto, você pode preencher new_table de uma fonte de dados remota. Para criar new_table a partir de uma tabela de origem remota, especifique a tabela de origem usando um nome de quatro partes no formulário linked_server. catálogo. esquema. na cláusula FROM da instrução SELECT. Como alternativa, você pode usar a função OPENQUERY ou a função OPENDATASOURCE na cláusula FROM para especificar a fonte de dados remota.

Grupo de ficheiros
Especifica o nome do grupo de arquivos no qual a nova tabela será criada. O grupo de arquivos especificado deve existir no banco de dados, caso contrário, o mecanismo do SQL Server lança um erro.

Aplica-se a: SQL Server 2016 (13.x) SP2 e posterior.

Tipos de dados

O atributo FILESTREAM não é transferido para a nova tabela. FILESTREAM BLOBs são copiados e armazenados na nova tabela como varbinary(max) BLOBs. Sem o atributo FILESTREAM, o tipo de dados varbinary(max) tem uma limitação de 2 GB. Se um BLOB FILESTREAM exceder esse valor, o erro 7119 será gerado e a instrução será interrompida.

Quando uma coluna de identidade existente é selecionada em uma nova tabela, a nova coluna herda a propriedade IDENTITY, a menos que uma das seguintes condições seja verdadeira:

  • A instrução SELECT contém uma associação.

  • São associadas múltiplas instruções SELECT com UNION.

  • A coluna de identidade é listada mais de uma vez na lista de seleção.

  • A coluna de identidade faz parte de uma expressão.

  • A coluna de identidade é de uma fonte de dados remota.

Se qualquer uma dessas condições for verdadeira, a coluna será criada NOT NULL em vez de herdar a propriedade IDENTITY. Se uma coluna de identidade for necessária na nova tabela, mas essa coluna não estiver disponível, ou se você quiser um valor de semente ou incremento diferente da coluna de identidade de origem, defina a coluna na lista de seleção usando a função IDENTIDADE. Consulte "Criando uma coluna de identidade usando a função IDENTIDADE" na seção Exemplos abaixo.

Remarks

A SELECT...INTO instrução opera em duas partes - a nova tabela é criada e, em seguida, as linhas são inseridas. Isso significa que, se as inserções falharem, todas serão revertidas, mas a nova tabela (vazia) permanecerá. Se você precisar que toda a operação seja bem-sucedida ou falhe como um todo, use uma transação explícita.

O Warehouse no Microsoft Fabric não oferece suporte a grupos de arquivos. As referências e exemplos neste artigo para grupos de arquivos não se aplicam ao Warehouse no Microsoft Fabric.

Limitações e Restrições

Não é possível especificar uma variável de tabela ou um parâmetro com valor de tabela como a nova tabela.

Não é possível usar SELECT...INTO para criar uma tabela particionada, mesmo quando a tabela de origem é particionada. 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. Para inserir linhas em uma tabela particionada, você deve primeiro criar a tabela particionada e, em seguida, usar a INSERT INTO...SELECT...FROM instrução.

Os índices, restrições e gatilhos definidos na tabela de origem não são transferidos para a nova tabela, nem podem ser especificados na SELECT...INTO instrução. Se esses objetos forem necessários, você poderá criá-los depois de executar a SELECT...INTO instrução.

A especificação de uma ORDER BY cláusula não garante que as linhas sejam inseridas na ordem especificada.

Quando uma coluna esparsa é incluída na lista de seleção, a propriedade coluna esparsa não é transferida para a coluna na nova tabela. Se essa propriedade for necessária na nova tabela, altere a definição de coluna depois de executar o SELECT... Declaração INTO para incluir esta propriedade.

Quando uma coluna computada é incluída na lista de seleção, a coluna correspondente na nova tabela não é uma coluna calculada. Os valores na nova coluna são os valores que foram calculados no momento SELECT...INTO em que foi executado.

Comportamento de Registo

A quantidade de log para SELECT...INTO depende do modelo de recuperação em vigor para o banco de dados. No modelo de recuperação simples ou no modelo de recuperação bulk-logged, as operações em massa são minimamente registradas. Com o registro em log mínimo, usar a SELECT...INTO instrução pode ser mais eficiente do que criar uma tabela e, em seguida, preencher a tabela com uma instrução INSERT. Para obter mais informações, consulte O log de transações (SQL Server).

SELECT...INTO instruções que contêm funções definidas pelo usuário (UDFs) são operações totalmente registradas. Se as funções definidas pelo usuário usadas na SELECT...INTO instrução não executarem nenhuma operação de acesso a dados, você poderá especificar a cláusula SCHEMABINDING para as funções definidas pelo usuário, que definirá a propriedade UserDataAccess derivada para essas funções definidas pelo usuário como 0. Após essa alteração, SELECT...INTO as instruções serão minimamente registradas. Se a SELECT...INTO instrução ainda fizer referência a pelo menos uma função definida pelo usuário que tenha essa propriedade definida como 1, a operação será totalmente registrada.

Permissions

Requer a permissão CREATE TABLE no banco de dados e a permissão ALTER no esquema no qual a tabela está sendo criada.

Examples

A. Criando uma tabela especificando colunas de várias fontes

O exemplo seguinte cria a tabela dbo.EmployeeAddresses na base de dados AdventureWorks2025 selecionando sete colunas de várias tabelas relacionadas com funcionários e endereços.

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. Inserindo linhas usando o registro mínimo

O exemplo a seguir cria a tabela dbo.NewProducts e insere linhas da Production.Product tabela. O exemplo assume que o modelo de recuperação da base de dados AdventureWorks2025 está definido para FULL. Para garantir que o mínimo registo seja utilizado, o modelo de recuperação da base de dados AdventureWorks2025 é definido para BULK_LOGGED antes das linhas serem inseridas e reiniciado para FULL após o SELECT... INTO. Este processo garante que o... A instrução INTO usa espaço mínimo no log de transações e funciona de forma eficiente.

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. Criando uma coluna de identidade usando a função IDENTIDADE

O exemplo seguinte utiliza a função IDENTITY para criar uma coluna identidade na nova tabela Person.USAddress da base de dados AdventureWorks2025. Isso é necessário porque a instrução SELECT que define a tabela contém uma junção, o que faz com que a propriedade IDENTITY não seja transferida para a nova tabela. Observe que os valores de semente e incremento especificados na função IDENTITY são diferentes daqueles da AddressID coluna na tabela Person.Addressde origem.

-- 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. Criando uma tabela especificando colunas de uma fonte de dados remota

O exemplo a seguir demonstra três métodos de criação de uma nova tabela no servidor local a partir de uma fonte de dados remota. O exemplo começa criando um link para a fonte de dados remota. O nome MyLinkServer, do servidor vinculado é então especificado na cláusula FROM do primeiro SELECT... INTO e na função OPENQUERY do segundo SELECT... Declaração INTO. O terceiro SELECT... A instrução INTO usa a função OPENDATASOURCE, que especifica a fonte de dados remota diretamente em vez de usar o nome do servidor vinculado.

Aplica-se a: SQL Server 2008 (10.0.x) e posterior.

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 de uma tabela externa criada com o PolyBase

Importe dados do Hadoop ou do Armazenamento do Azure para o SQL Server para armazenamento persistente. Use SELECT INTO para importar dados referenciados por uma tabela externa para armazenamento persistente no SQL Server. Crie uma tabela relacional imediatamente e, em seguida, crie um índice de armazenamento de colunas na parte superior da tabela em uma segunda etapa.

Aplica-se 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. Copiando os dados de uma tabela para outra e criando a nova tabela em um grupo de arquivos especificado

O exemplo a seguir demonstra a criação de uma nova tabela como uma cópia de outra tabela e o carregamento em um grupo de arquivos especificado diferente do grupo de arquivos padrão do usuário.

Aplica-se a: SQL Server 2016 (13.x) SP2 e posterior.

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

Ver também

SELECIONAR (Transact-SQL)
SELECT Exemplos (Transact-SQL)
INSERIR (Transact-SQL)
IDENTIDADE (função) (Transact-SQL)