SQL Server : Les 3 différents types d’INSERT
Comment insérer des données dans une table ? Eh bien par INSERT. Derrière cette évidence saviez vous que vous avez en fait 3 types d'INSERT ?
INSERT / VALUES
Le courant d'entre tous, c'est celui-ci qui permet d'insérer les valeurs d'un enregistrement à la fois.
INSERT MaTable
VALUES (1, 2, 3)
Le INTO est toujours optionnel dans la syntaxe, la liste de champs suivant le nom de la table l'est aussi, si le nombre de valeurs dans le VALUES correspondant au nombre / type de champs de la table. Dans le cas contraire cette liste est obligatoire.
INSERT MaTable (ChampA, ChampB)
VALUES (1, 2)
Il est possible d'utiliser les mots clefs DEFAULT et DEFAULT VALUES , ils permettent respectivement d'insérer la valeur par défaut du champ où l'on spécifie DEFAULT ou NULL si ce dernier n'en possède pas. Pour le second cela permet d'indiquer que l'on souhaite les valeurs par défaut de tous les champs de la table.
-- Insertion de la valeur par défaut de ChampB
INSERT MaTable (ChampA, ChampB)
VALUES (1, DEFAULT)
-- Insertion de la valeur par défaut de tous les champs de la table
INSERT MaTable (ChampA, ChampB)
DEFAULT VALUES
Sous SQL Server 2008, il sera possible d'insérer plusieurs enregistrements à la fois avec cette syntaxe.
INSERT MaTable (ChampA, ChampB)
VALUES (1, 2), (3, 4), (5, 6)
Ici on insère 3 enregistrements dans MaTable.
INSERT / SELECT
La seconde variante permet l'insertion multiple d'enregistrements à partir d'une autre source de données (ou de la même).
INSERT MaTable
SELECT *
FROM MaTable2
La règle pour la liste de champ suivant la table où vont être inséré les enregistrements est la même que pour VALUES, le nombre de champs et leur type doivent être respectés. Il est donc aussi possible de fournir la liste des champs des 2 tables
INSERT MaTable (ChampA, ChampB)
SELECT ChampX, ChampY
FROM MaTable2
Fournir une constance est encore possible, elle sera juste ajouté au SELECT
INSERT MaTable (ChampA, ChampB)
SELECT ChampX, 7
FROM MaTable2
INSERT / EXEC
Dernière variante sans doute la moins connu, permet de récupérer le résultat d'une procédure stockée ou de l'exécution de SQL dynamique. La difficulté de cette syntaxe réside dans le fait qu'il faut créer la table sur laquelle faire l'insertion sans quasiment connaitre la structure renvoyée.
INSERT MaTable
EXEC MaProc 1, 2
INSERT MaTable2
EXEC('DBCC SHOWCONTIG WITH TABLERESULTS')
Ici aussi il est possible de spécifier la liste des champs de la table de destination derrière son nom. Par contre au niveau de l'EXEC il n'est pas possible de changer quoi que ce soit. On ne récupèrera de cette manière que le premier jeu de données dans le cas où la procédure stockées en renvoie plusieurs.
Cette méthode permet en fait de tout récupérer étant donné que le SQL dynamique y est autorisé, en prenant exemple sur le second exemple, même le flux de données des commandes DBCC peut être inséré dans des tables.
Bon développement…
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :