SELECT - Clause INTO (Transact-SQL)

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Entrepôt dans Microsoft Fabric

SELECT...INTO crée une table dans le groupe de fichiers par défaut et y insère les lignes résultantes de la requête. Pour afficher la syntaxe SELECT complète, consultez SELECT (Transact-SQL).

Conventions de la syntaxe Transact-SQL

Syntaxe

[ INTO new_table ]
[ ON filegroup ]

Remarque

Pour afficher la syntaxe Transact-SQL pour SQL Server 2014 (12.x) et versions antérieures, consultez la Documentation sur les versions antérieures.

Arguments

nouvelle_table
Spécifie le nom d'une table à créer en fonction des colonnes de la liste de sélection et des lignes choisies à partir de la source de données.

Le format de new_table est déterminé par l’évaluation des expressions de la liste de sélection. Les colonnes de new_table sont créées dans l’ordre spécifié par la liste de sélection. Chaque colonne de new_table a le même nom, le même type de données, la même possibilité de valeur Null et la même valeur que l’expression correspondante dans la liste de sélection. La propriété IDENTITY d'une colonne est transférée sauf dans les conditions définies dans « Utilisation des colonnes d'identité » dans la section Remarques.

Pour créer la table dans une autre base de données de la même instance de SQL Server, spécifiez new_table comme nom complet sous la forme database.schema.table_name.

Vous ne pouvez pas créer new_table sur un serveur distant, mais vous pouvez remplir new_table à partir d’une source de données distante. Pour créer new_table à partir d’une table source distante, spécifiez la table source par un nom en quatre parties sous la forme linked_server.catalog.schema.object dans la clause FROM de l’instruction SELECT. Vous pouvez aussi utiliser la fonction OPENQUERY ou la fonction OPENDATASOURCE dans la clause FROM pour spécifier la source de données distante.

groupe_fichiers
Spécifie le nom du groupe de fichiers dans lequel créer la table. Si le groupe de fichiers spécifié n’existe pas dans la base de données, le moteur SQL Server lève une erreur.

S’applique à : SQL Server 2016 (13.x) SP2 et versions ultérieures.

Types de données

L'attribut FILESTREAM n'est pas transféré dans la nouvelle table. Les objets BLOB FILESTREAM sont copiés et stockés dans la nouvelle table en tant qu’objets BLOB varbinary(max) . Sans l’attribut FILESTREAM, le type de données varbinary(max) est limité à 2 Go. Si un objet BLOB FILESTREAM dépasse cette valeur, l'erreur 7119 se déclenche et l'instruction s'arrête.

Lorsque vous sélectionnez une colonne d'identité existante dans une nouvelle table, la nouvelle colonne hérite de la propriété IDENTITY sauf si l'une des conditions suivantes est vraie :

  • L'instruction SELECT contient une jointure.

  • Plusieurs instructions SELECT sont reliées par UNION.

  • La colonne d'identité est répertoriée plus d'une fois dans la liste de sélection.

  • La colonne d'identité fait partie d'une expression.

  • La colonne d'identité fait partie d'une source de données distante.

Si l'une de ces conditions est vérifiée, la colonne est créée avec l'attribut NOT NULL au lieu d'hériter de la propriété IDENTITY. Si une colonne d'identité est requise dans la nouvelle table et si ce type de colonne n'est pas disponible, ou si vous voulez une valeur initiale ou une valeur d'incrément différente de la colonne d'identité source, définissez la colonne dans la liste de sélection à l'aide de la fonction IDENTITY. Consultez « Création d'une colonne d'identité à l'aide de la fonction IDENTITY » dans la section Exemples ci-dessous.

Notes

L’instruction SELECT...INTO s’exécute en deux temps : la nouvelle table est créée, puis les lignes sont insérées. Cela signifie que, si les insertions échouent, elles sont toutes annulées, mais la nouvelle table (vide) est conservée. Si l’opération doit réussir ou échouer dans sa globalité, utilisez une transaction explicite.

L’entrepôt dans Microsoft Fabric ne prend pas en charge les groupes de fichiers. Les références et les exemples de cet article aux groupes de fichiers ne s’appliquent pas à l’entrepôt dans Microsoft Fabric.

Limitations et restrictions

Vous ne pouvez pas spécifier une variable de table ou un paramètre table en tant que nouvelle table.

Vous ne pouvez pas utiliser SELECT...INTO pour créer une table partitionnée, même quand la table source est partitionnée. SELECT...INTO n’utilise pas le schéma de partition de la table source ; à la place, la nouvelle table est créée dans le groupe de fichiers par défaut. Pour insérer des lignes dans une table partitionnée, vous devez d’abord créer la table partitionnée, puis utiliser l’instruction INSERT INTO...SELECT...FROM.

Les index, contraintes et déclencheurs définis dans la table source ne sont pas transférés dans la nouvelle table ; ils ne peuvent pas non plus être spécifiés dans l’instruction SELECT...INTO. Si ces objets sont nécessaires, vous pouvez les créer après avoir exécuté l’instruction SELECT...INTO.

La spécification d’une clause ORDER BY ne garantit pas que les lignes soient insérées dans l’ordre spécifié.

Lorsqu'une colonne éparse est comprise dans la liste de sélection, la propriété de colonne éparse n'est pas transférée à la colonne de la nouvelle table. Si cette propriété est obligatoire dans la nouvelle table, modifiez la définition de colonne après avoir exécuté l'instruction SELECT...INTO afin d'inclure cette propriété.

Lorsqu'une colonne calculée est comprise dans la liste de sélection, la colonne correspondante de la nouvelle table n'est pas une colonne calculée. Les valeurs de la nouvelle colonne sont les valeurs calculées au moment de l’exécution de l’instruction SELECT...INTO.

Comportement de journalisation

La quantité d’informations journalisées pour SELECT...INTO dépend du mode de récupération en vigueur pour la base de données. En mode de récupération simple ou en mode de récupération utilisant les journaux de transactions, les opérations de chargement en masse font l'objet d'une journalisation minimale. Avec une journalisation minimale, l’utilisation de l’instruction SELECT...INTO peut s’avérer plus efficace que la création d’une table et son remplissage avec une instruction INSERT. Pour plus d’informations, consultez Journal des transactions (SQL Server).

Les instructions SELECT...INTO qui contiennent des fonctions définies par l’utilisateur (UDF) sont des opérations entièrement journalisées. Si les fonctions définies par l’utilisateur utilisées dans l’instruction SELECT...INTO n’effectuent aucune opération d’accès aux données, vous pouvez spécifier la clause SCHEMABINDING pour les fonctions définies par l’utilisateur, qui définira la propriété UserDataAccess dérivée de ces fonctions définies par l’utilisateur sur 0. Après cette modification, les instructions SELECT...INTO sont journalisées de façon minimale. Si l’instruction SELECT...INTO fait toujours référence à au moins une fonction définie par l’utilisateur dont la propriété a la valeur 1, l’opération est entièrement journalisée.

Autorisations

Requiert l'autorisation CREATE TABLE dans la base de données de destination.

Exemples

R. Création d'une table en spécifiant des colonnes provenant de plusieurs sources

L’exemple suivant crée la table dbo.EmployeeAddresses dans la base de données AdventureWorks2022 en sélectionnant sept colonnes de diverses tables liées aux employés et aux adresses.

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. Insertion de lignes en utilisant une journalisation minimale

L'exemple suivant crée la table dbo.NewProducts et insère des lignes provenant de la table Production.Product. L’exemple suppose que le mode de récupération de la base de données AdventureWorks2022 a la valeur FULL. Pour garantir une journalisation minimale, le mode de récupération de la base de données AdventureWorks2022 a la valeur BULK_LOGGED avant l’insertion des lignes ; il reprend ensuite la valeur FULL après l’utilisation de l’instruction SELECT...INTO. Ce processus permet de garantir que l'instruction SELECT...INTO utilise un espace minimal dans le journal des transactions et qu'elle s'exécute de manière efficace.

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. Création d'une colonne d'identité à l'aide de la fonction IDENTITY

L’exemple suivant utilise la fonction IDENTITY pour créer une colonne d’identité dans la nouvelle table Person.USAddress de la base de données AdventureWorks2022. Cela est nécessaire, car l'instruction SELECT qui définit la table contient une jointure qui empêche le transfert de la propriété IDENTITY vers la nouvelle table. Notez que la valeur initiale et la valeur d'incrément spécifiées dans la fonction IDENTITY sont différentes de celles de la colonne AddressID dans la table source 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. Création d'une table en spécifiant des colonnes provenant d'une source de données distante

L'exemple suivant illustre l'utilisation de trois méthodes de création d'une table sur le serveur local à partir d'une source de données distante. L'exemple commence par créer un lien vers la source de données distante. Le nom du serveur lié, MyLinkServer,, est ensuite spécifié dans la clause FROM de la première instruction SELECT...INTO, ainsi que dans la fonction OPENQUERY de la deuxième instruction SELECT...INTO. La troisième instruction SELECT...INTO utilise la fonction OPENDATASOURCE, qui spécifie directement la source de données distante au lieu d'utiliser le nom du serveur lié.

S’applique à : SQL Server 2008 (10.0.x) et versions ultérieures.

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. Importer à partir d’une table externe créée avec PolyBase

Importez des données de Hadoop ou d’Azure Storage dans SQL Server à des fins de stockage permanent. Utilisez SELECT INTO pour importer des données référencées par une table externe en vue de leur stockage permanent dans SQL Server. Créez une table relationnelle à la volée, puis créez un index column-store en plus de la table.

S’applique à : 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. Copier les données d’une table vers une autre et créer la nouvelle table sur un groupe de fichiers spécifié

L’exemple suivant illustre la création d’une table en tant que copie d’une autre table et son chargement dans un autre groupe de fichiers que le groupe de fichiers par défaut de l’utilisateur.

S’applique à : SQL Server 2016 (13.x) SP2 et versions ultérieures.

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

Voir aussi

SELECT (Transact-SQL)
Exemples SELECT (Transact-SQL)
INSERT (Transact-SQL)
IDENTITY (Fonction) (Transact-SQL)