{"id":1135,"date":"2014-12-04T21:48:24","date_gmt":"2014-12-04T20:48:24","guid":{"rendered":"http:\/\/www.sqlserver.fr\/blog\/?p=1135"},"modified":"2026-05-02T14:30:46","modified_gmt":"2026-05-02T12:30:46","slug":"ssis-inserer-une-ligne-dans-une-table-avec-identity-et-recuperer-lidentifiant","status":"publish","type":"post","link":"https:\/\/www.sqlserver.fr\/blog\/ssis-inserer-une-ligne-dans-une-table-avec-identity-et-recuperer-lidentifiant\/","title":{"rendered":"SSIS : Ins\u00e9rer une ligne dans une table avec IDENTITY et r\u00e9cup\u00e9rer l&rsquo;identifiant"},"content":{"rendered":"<p>Dans les bases de donn\u00e9es relationnelles, il est courant d&rsquo;avoir des identifiants techniques au niveau de chaque table s&rsquo;appuyant sur la notion d&rsquo;IDENTITY, c&rsquo;est-\u00e0-dire de compteur auto-incr\u00e9ment\u00e9. Lorsque l&rsquo;on cherche \u00e0 remplir des tables via SQL Server Integration Services (SSIS), il convient donc de r\u00e9cup\u00e9rer cet auto-incr\u00e9ment lors des insertions pour pouvoir les utiliser dans les tables filles.<!--more--><\/p>\n<p>Plusieurs solutions sont possibles pour impl\u00e9menter ce besoin dans SSIS. Voici une proposition, qui ne se pr\u00e9tend pas la plus rapide sur de fortes volum\u00e9tries, mais qui a au moins l&rsquo;avantage d&rsquo;\u00eatre simple d&rsquo;impl\u00e9mentation.<\/p>\n<p>Tout d&rsquo;abord, voici la structure que nous utiliserons dans cet exemple :<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"sql\">CREATE TABLE Mere(IdMere int identity PRIMARY KEY,\r\n\t\t\t\t\tNomMere nvarchar(100))\r\nCREATE TABLE Fille(IdFille int identity,\r\n\t\t\t\t\tIdMere int CONSTRAINT FK FOREIGN KEY REFERENCES Mere(IdMere),\r\n\t\t\t\t\tNomFille nvarchar(100))<\/pre>\n<p>C&rsquo;est dans ces deux tables Mere et Fille que nous chercherons \u00e0 enregistrer les donn\u00e9es pr\u00e9sent\u00e9es dans le fichier XML suivant :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1140\" src=\"https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2014\/12\/XML.png\" alt=\"XML\" width=\"304\" height=\"164\" srcset=\"https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2014\/12\/XML.png 304w, https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2014\/12\/XML-300x161.png 300w\" sizes=\"auto, (max-width: 304px) 100vw, 304px\" \/><\/p>\n<p>Le package SSIS propos\u00e9 s&rsquo;appuie uniquement sur un flux de donn\u00e9es, qui a la structure suivante :<\/p>\n<p><a href=\"https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2014\/12\/Package.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1141\" src=\"https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2014\/12\/Package.png\" alt=\"Package\" width=\"373\" height=\"491\" srcset=\"https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2014\/12\/Package.png 373w, https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2014\/12\/Package-227x300.png 227w\" sizes=\"auto, (max-width: 373px) 100vw, 373px\" \/><\/a>Le d\u00e9but du processus est une simple lecture du fichier XML, dont le d\u00e9tail ne pr\u00e9sente pas d&rsquo;int\u00e9r\u00eat ici.<\/p>\n<p>Il y a ensuite l&rsquo;ajout d&rsquo;une colonne dans le flux de gauche. Il s&rsquo;agit de cr\u00e9er une colonne destin\u00e9e \u00e0 contenir l&rsquo;identifiant technique IdMere (colonne IDENTITY de la table Mere).<\/p>\n<p><a href=\"https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2014\/12\/AjoutColonne.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-1142\" src=\"https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2014\/12\/AjoutColonne-620x580.png\" alt=\"AjoutColonne\" width=\"620\" height=\"580\" srcset=\"https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2014\/12\/AjoutColonne-620x580.png 620w, https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2014\/12\/AjoutColonne-300x280.png 300w, https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2014\/12\/AjoutColonne-624x584.png 624w, https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2014\/12\/AjoutColonne.png 677w\" sizes=\"auto, (max-width: 620px) 100vw, 620px\" \/><\/a>Ensuite, il y a l&rsquo;insertion \u00e0 proprement parler dans la table Mere. Mais cette insertion se fait en r\u00e9cup\u00e9rant la valeur de l&rsquo;auto-incr\u00e9ment cr\u00e9\u00e9 par le syst\u00e8me.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-1144\" src=\"https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2014\/12\/AjoutMere1-620x654.png\" alt=\"AjoutMere1\" width=\"620\" height=\"654\" srcset=\"https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2014\/12\/AjoutMere1-620x654.png 620w, https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2014\/12\/AjoutMere1-284x300.png 284w, https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2014\/12\/AjoutMere1.png 624w\" sizes=\"auto, (max-width: 620px) 100vw, 620px\" \/><\/p>\n<p><a href=\"https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2014\/12\/AjoutMere2.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-1145\" src=\"https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2014\/12\/AjoutMere2-620x515.png\" alt=\"AjoutMere2\" width=\"620\" height=\"515\" srcset=\"https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2014\/12\/AjoutMere2-620x515.png 620w, https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2014\/12\/AjoutMere2-300x249.png 300w, https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2014\/12\/AjoutMere2-624x518.png 624w, https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2014\/12\/AjoutMere2.png 799w\" sizes=\"auto, (max-width: 620px) 100vw, 620px\" \/><\/a><a href=\"https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2014\/12\/AjoutMere3.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-1146\" src=\"https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2014\/12\/AjoutMere3-620x631.png\" alt=\"AjoutMere3\" width=\"620\" height=\"631\" srcset=\"https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2014\/12\/AjoutMere3-620x631.png 620w, https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2014\/12\/AjoutMere3-294x300.png 294w, https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2014\/12\/AjoutMere3.png 624w\" sizes=\"auto, (max-width: 620px) 100vw, 620px\" \/><\/a>D\u00e8s lors on a en sortie de ce composant d&rsquo;ajout \u00e0 la fois l&rsquo;identifiant interne SSIS de l&rsquo;entit\u00e9 Mere (Mere_Id, issu de la d\u00e9composition du contenu XML) et la valeur de l&rsquo;auto-incr\u00e9ment IdMere, qui devra \u00eatre ajout\u00e9 dans la table Fille. On effectue donc deux tris sur la colonne Mere_Id, pour ensuite fusionner les deux tables via une jointure sur cette colonne.<\/p>\n<p><a href=\"https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2014\/12\/Fusion.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1147\" src=\"https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2014\/12\/Fusion.png\" alt=\"Fusion\" width=\"601\" height=\"636\" srcset=\"https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2014\/12\/Fusion.png 601w, https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2014\/12\/Fusion-283x300.png 283w\" sizes=\"auto, (max-width: 601px) 100vw, 601px\" \/><\/a><\/p>\n<p>On peut enfin ins\u00e9rer les colonnes dans la table Fille, puisque l&rsquo;on a d\u00e9sormais\u00a0\u00e0 la fois le Nom\u00a0de l&rsquo;entit\u00e9 Fille et l&rsquo;identifiant de lien (cl\u00e9 \u00e9trang\u00e8re) vers\u00a0l&rsquo;entit\u00e9\u00a0M\u00e8re.<a href=\"https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2014\/12\/Insert.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-1148\" src=\"https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2014\/12\/Insert-620x606.png\" alt=\"Insert\" width=\"620\" height=\"606\" srcset=\"https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2014\/12\/Insert-620x606.png 620w, https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2014\/12\/Insert-300x293.png 300w, https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2014\/12\/Insert-624x610.png 624w, https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2014\/12\/Insert.png 650w\" sizes=\"auto, (max-width: 620px) 100vw, 620px\" \/><\/a><\/p>\n<p>Voici donc\u00a0la pr\u00e9sentation d&rsquo;une solution SSIS qui permet d&rsquo;obtenir une insertion\u00a0\u00e0 la fois des donn\u00e9es et la table M\u00e8re et de la table Fille, avec une liaison de cl\u00e9 \u00e9trang\u00e8re sur une colonne d&rsquo;auto-incr\u00e9ment.\u00a0<a href=\"https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2014\/12\/Resultat.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1149\" src=\"https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2014\/12\/Resultat.png\" alt=\"Resultat\" width=\"220\" height=\"276\" \/><\/a>A noter toutefois que ce fonctionnement traite les enregistrements \u00e0 ins\u00e9rer dans la table Mere \u00e0 l&rsquo;unit\u00e9, et n&rsquo;est donc pas n\u00e9cessairement optimal dans les cas d&rsquo;insertions massives.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dans les bases de donn\u00e9es relationnelles, il est courant d&rsquo;avoir des identifiants techniques au niveau de chaque table s&rsquo;appuyant sur la notion d&rsquo;IDENTITY, c&rsquo;est-\u00e0-dire de compteur auto-incr\u00e9ment\u00e9. Lorsque l&rsquo;on cherche \u00e0 remplir des tables via SQL Server Integration Services (SSIS), &hellip; <a href=\"https:\/\/www.sqlserver.fr\/blog\/ssis-inserer-une-ligne-dans-une-table-avec-identity-et-recuperer-lidentifiant\/\">Continuer la lecture <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":7,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1135","post","type-post","status-publish","format-standard","hentry","category-article_sql"],"_links":{"self":[{"href":"https:\/\/www.sqlserver.fr\/blog\/wp-json\/wp\/v2\/posts\/1135","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sqlserver.fr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sqlserver.fr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sqlserver.fr\/blog\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sqlserver.fr\/blog\/wp-json\/wp\/v2\/comments?post=1135"}],"version-history":[{"count":25,"href":"https:\/\/www.sqlserver.fr\/blog\/wp-json\/wp\/v2\/posts\/1135\/revisions"}],"predecessor-version":[{"id":1924,"href":"https:\/\/www.sqlserver.fr\/blog\/wp-json\/wp\/v2\/posts\/1135\/revisions\/1924"}],"wp:attachment":[{"href":"https:\/\/www.sqlserver.fr\/blog\/wp-json\/wp\/v2\/media?parent=1135"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sqlserver.fr\/blog\/wp-json\/wp\/v2\/categories?post=1135"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sqlserver.fr\/blog\/wp-json\/wp\/v2\/tags?post=1135"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}