Clause INTO (Transact-SQL)

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

Icône Lien de rubriqueConventions de syntaxe Transact-SQL

Syntaxe

[ INTO new_table ]

Arguments

  • new_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 possède 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 en tant que nom complet sous la forme database.schema.table_name.

    Vous ne pouvez pas créer new_table sur un serveur distant ; toutefois, 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 à l'aide d'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.

Types de données

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, une clause GROUP BY ou une fonction d'agrégation.

  • 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.

Limitations et restrictions

Les limitations et restrictions suivantes à la clause INTO :

  • 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 lorsque 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.

  • 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.

  • L'instruction SELECT...INTO ne peut pas être utilisée avec la clause COMPUTE.

  • 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.

  • Les index, contraintes et déclencheurs définis dans la table source ne sont pas transférés dans la nouvelle table ; par ailleurs, ils ne peuvent pas non plus être spécifiés dans l'instruction SELECT...INTO. Si ces objets sont requis, vous devez 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 seront insérées dans l'ordre spécifié.

Comportement de journalisation

L'importance de la journalisation 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 à l'aide d'une instruction INSERT. Pour plus d'informations, consultez Opérations pouvant faire l'objet d'une journalisation minimale.

Autorisations

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

Exemples

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

L'exemple suivant crée la table dbo.EmployeeAddresses en sélectionnant sept colonnes de diverses tables liées aux salariés et aux adresses.

USE AdventureWorks;
GO
SELECT c.FirstName, c.LastName, e.Title, a.AddressLine1, a.City, sp.Name AS [State/Province], a.PostalCode
INTO dbo.EmployeeAddresses
FROM Person.Contact AS c
JOIN HumanResources.Employee AS e ON e.ContactID = c.ContactID
JOIN HumanResources.EmployeeAddress AS ea ON ea.EmployeeID = e.EmployeeID
JOIN Person.Address AS a on a.AddressID = ea.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. Il suppose que le mode de récupération de la base de données AdventureWorks a la valeur FULL. Pour garantir une journalisation minimale, le mode de récupération de la base de données AdventureWorks 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.

USE AdventureWorks;
GO
IF OBJECT_ID ('dbo.NewProducts', 'U') IS NOT NULL
    DROP TABLE dbo.NewProducts;
GO
ALTER DATABASE AdventureWorks SET RECOVERY BULK_LOGGED;
GO

SELECT * INTO dbo.NewProducts
FROM Production.Product
WHERE ListPrice > $25 
AND ListPrice < $100;
GO
ALTER DATABASE AdventureWorks 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. 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.

USE AdventureWorks;
GO
-- 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é.

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'AdventureWorks';
GO
USE AdventureWorks;
GO
-- Specify the remote data source in the FROM clause using a four-part name 
-- in the form linked_server.catalog.schema.object.
SELECT *
INTO dbo.Departments
FROM MyLinkServer.AdventureWorks.HumanResources.Department
GO
-- Use the OPENQUERY function to access the remote data source.
SELECT *
INTO dbo.DepartmentsUsingOpenQuery
FROM OPENQUERY(MyLinkServer, 'SELECT *
               FROM AdventureWorks.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 *
INTO dbo.DepartmentsUsingOpenDataSource
FROM OPENDATASOURCE('SQLNCLI',
    'Data Source=server_name;Integrated Security=SSPI')
    .AdventureWorks.HumanResources.Department;
GO