Insertion des données

Effectué

Transact-SQL propose plusieurs façons d’insérer des lignes dans une table.

L’instruction INSERT

L’instruction INSERT est utilisée pour ajouter une ou plusieurs lignes à une table. Il existe plusieurs formes pour cette instruction.

La syntaxe de base d’une instruction INSERT simple est illustrée ci-dessous :

INSERT [INTO] <Table> [(column_list)]
VALUES ([ColumnName or an expression or DEFAULT or NULL],…n)

Avec cette forme de l’instruction INSERT, appelée INSERT VALUES, vous pouvez spécifier les colonnes qui comporteront des valeurs et l’ordre dans lequel les données seront présentées pour chaque ligne insérée dans la table. La column_list est facultative mais recommandée. Sans column_list, l’instruction INSERT attend une valeur pour chaque colonne de la table dans l’ordre dans lequel les colonnes ont été définies. Vous pouvez également fournir les valeurs de ces colonnes sous la forme d’une liste séparée par des virgules.

Lorsque vous répertoriez des valeurs, le mot clé DEFAULT signifie qu’une valeur prédéfinie, qui a été spécifiée lors de la création de la table, sera utilisée. Il existe trois façons de déterminer une valeur par défaut :

  • Si une colonne a été définie pour avoir une valeur générée automatiquement, cette valeur sera utilisée. Les valeurs générées automatiquement seront abordées plus loin dans ce module.
  • Lorsqu’une table est créée, une valeur par défaut peut être fournie pour une colonne, et cette valeur est utilisée si DEFAULT est spécifié.
  • Si une colonne a été définie pour autoriser les valeurs NULL et que la colonne n’est pas générée automatiquement et n’a pas de valeur par défaut définie, la valeur NULL est insérée comme valeur par défaut.

Les détails de la création de tables sortent du cadre de ce module. Toutefois, il est souvent utile de voir quelles colonnes se trouvent dans une table. Le moyen le plus simple consiste à exécuter simplement une instruction SELECT sur la table sans retourner de lignes. Si vous utilisez une condition WHERE qui ne peut jamais avoir la valeur TRUE, aucune ligne ne peut être retournée.

SELECT * FROM Sales.Promotion
WHERE 1 = 0;

Cette instruction affiche toutes les colonnes et leurs noms, mais n’affiche pas les types de données ou les propriétés, par exemple si les valeurs NULL sont autorisées ou si des valeurs par défaut sont spécifiées. Voici un exemple de sortie de la requête :

PromotionName

StartDate

IDModèleProduit

Remise

Notes

Pour insérer des données dans cette table, vous pouvez utiliser l’instruction INSERT comme indiqué ici.

INSERT INTO Sales.Promotion (PromotionName,StartDate,ProductModelID,Discount,Notes)
VALUES
('Clearance Sale', '01/01/2021', 23, 0.1, '10% discount');

Dans cet exemple ci-dessus, la liste des colonnes peut être omise, car nous fournissons une valeur pour chaque colonne dans le bon ordre :

INSERT INTO Sales.Promotion
VALUES
('Clearance Sale', '01/01/2021', 23, 0.1, '10% discount');

Supposons que la table est définie de façon à ce qu’une valeur par défaut de la date actuelle soit appliquée à la colonne StartDate et que la colonne Notes autorise les valeurs NULL. Vous pouvez indiquer que vous souhaitez utiliser ces valeurs explicitement, en procédant ainsi :

INSERT INTO Sales.Promotion
VALUES
('Pull your socks up', DEFAULT, 24, 0.25, NULL);

Vous pouvez également omettre des valeurs dans l’instruction INSERT, auquel cas la valeur par défaut est utilisée si elle est définie. S’il n’y a aucune valeur par défaut, mais que la colonne autorise les valeurs NULL, une valeur NULL est insérée. Si vous ne fournissez pas de valeurs pour toutes les colonnes, vous devez disposer d’une liste de colonnes indiquant les valeurs de colonne que vous fournissez.

INSERT INTO Sales.Promotion (PromotionName, ProductModelID, Discount)
VALUES
('Caps Locked', 2, 0.2);

Outre l’insertion d’une seule ligne à la fois, l’instruction INSERT VALUES peut être utilisée pour insérer plusieurs lignes en fournissant plusieurs ensembles de valeurs séparées par des virgules. Les ensembles de valeurs sont également séparés par des virgules, comme suit :

(col1_val,col2_val,col3_val),
(col1_val,col2_val,col3_val)

Cette liste de valeurs est connue sous le nom de constructeur de valeurs de table. Voici un exemple d’insertion de deux lignes supplémentaires dans la table à l’aide d’un constructeur de valeurs de table :

INSERT INTO Sales.Promotion
VALUES
('The gloves are off!', DEFAULT, 3, 0.25, NULL),
('The gloves are off!', DEFAULT, 4, 0.25, NULL);

INSERT ... SELECT

En plus de spécifier un ensemble de valeurs littérales dans une instruction INSERT, T-SQL prend en charge l’utilisation des résultats d’autres opérations pour fournir des valeurs pour INSERT. Vous pouvez utiliser les résultats d’une instruction SELECT ou la sortie d’une procédure stockée pour fournir les valeurs de l’instruction INSERT.

Pour utiliser l’instruction INSERT avec une instruction SELECT imbriquée, générez une instruction SELECT pour remplacer la clause VALUES. Sous cette forme, appelée INSERT SELECT, vous pouvez insérer l’ensemble de lignes retourné par une requête SELECT dans une table de destination. L’utilisation d’INSERT SELECT présente les mêmes considérations qu’INSERT VALUES :

  • Vous pouvez éventuellement spécifier une liste de colonnes à la suite du nom de la table.
  • Vous devez fournir des valeurs de colonne ou la valeur par défaut, ou NULL, pour chaque colonne.

La syntaxe suivante illustre l’utilisation d’INSERT SELECT :

INSERT [INTO] <table or view> [(column_list)]
SELECT <column_list> FROM <table_list>...;

Notes

Des jeux de résultats de procédures stockées (ou même des lots dynamiques) peuvent également être utilisés comme entrée dans une instruction INSERT. Cette forme d’insertion, appelée INSERT EXEC, est conceptuellement similaire à INSERT SELECT et présente les mêmes considérations. Toutefois, les procédures stockées peuvent retourner plusieurs jeux de résultats, c’est pourquoi une attention supplémentaire est nécessaire.

L’exemple suivant insère plusieurs lignes pour une nouvelle promotion nommée Get Framed en récupérant l’ID de modèle et le nom de modèle de la table Production.ProductModel, pour chaque modèle contenant « frame » dans son nom.

INSERT INTO Sales.Promotion (PromotionName, ProductModelID, Discount, Notes)
SELECT DISTINCT 'Get Framed', m.ProductModelID, 0.1, '10% off ' + m.Name
FROM Production.ProductModel AS m
WHERE m.Name LIKE '%frame%';

Contrairement à une sous-requête, la sélection imbriquée utilisée avec une insertion n’est pas placée entre parenthèses.

SELECT ... INTO

Une autre option pour l’insertion de lignes, qui est similaire à INSERT SELECT, est l’instruction SELECT INTO. La plus grande différence entre INSERT SELECT et SELECT INTO est que SELECT INTO ne peut pas être utilisé pour insérer des lignes dans une table existante, car elle crée toujours une nouvelle table basée sur le résultat de l’instruction SELECT. Chaque colonne de la nouvelle table aura le même nom, le même type de données et la même possibilité de valeur NULL que la colonne (ou expression) correspondante dans la liste SELECT.

Pour utiliser SELECT INTO, ajoutez INTO <nouveau_nom_table> dans la clause SELECT de la requête, juste avant la clause FROM. Voici un exemple qui extrait des données de la table Sales.SalesOrderHeader dans une nouvelle table nommée Sales.Invoice.

SELECT SalesOrderID, CustomerID, OrderDate, PurchaseOrderNumber, TotalDue
INTO Sales.Invoice
FROM Sales.SalesOrderHeader;

Une opération SELECT INTO échouera s’il existe déjà une table avec le nom spécifié après INTO. Une fois la table créée, elle peut être traitée comme toute autre table. Vous pouvez effectuer une sélection à partir de celle-ci, la joindre à d’autres tables ou y insérer plus de lignes.