Bonjour,
Je suis confronté à une problématique pour la première et j'ai du mal à voir par quel bout l'aborder.
Suite à une action de l'utilisateur dans une application, je suis amené à insérer un lot de nouvelles lignes dans une table.
Jusque là, si j'ai bien compris, histoire de faire x appels à la même procédure stockée où x est le nombre de lignes à insérer, je dois créer un nouveau "user-defined table type" et l'utiliser comme paramètre de la procédure stockée.
Jusque là, pas de souci je pense (je n'ai pas encore testé mais cela me semble clair).
Le problème est que la table dans laquelle je dois faire les insertions est hérite d'une autre table. Pour insérer une ligne, pas de souci, je fais mon insertion dans la table parente et je récupère l'identifiant avec SCOPE_IDENTITY() pour savoir quoi mettre dans la table fille.
Mais si j'insère par lot, comment je récupère les identifiants ?
Voici le DDL des deux tables en question.
La table parente
La table fille
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 USE [GIFT_MANAGEMENT] GO /****** Object: Table [dbo].[T_GIFT_GFT] Script Date: 11/05/2012 14:46:54 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[T_GIFT_GFT]( [GFT_ID] [int] IDENTITY(1,1) NOT NULL, CONSTRAINT [PK_T_GIFT_GFT] PRIMARY KEY CLUSTERED ( [GFT_ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO
S'il y a un point sur lequel je n'ai pas été clair, n'hésitez pas !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 USE [GIFT_MANAGEMENT] GO /****** Object: Table [dbo].[T_CARD_CRD] Script Date: 11/05/2012 14:47:26 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[T_CARD_CRD]( [GFT_ID] [int] NOT NULL, [CRD_PREFIX] [tinyint] NOT NULL, [TCA_ID] [smallint] NOT NULL, [CRD_SERIAL] [int] NOT NULL, [CRD_RECHARGEABLE] [bit] NOT NULL, CONSTRAINT [PK_T_CARD_CRD] PRIMARY KEY CLUSTERED ( [GFT_ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO ALTER TABLE [dbo].[T_CARD_CRD] WITH CHECK ADD CONSTRAINT [FK_T_CARD_CRD_T_GIFT_GFT] FOREIGN KEY([GFT_ID]) REFERENCES [dbo].[T_GIFT_GFT] ([GFT_ID]) GO ALTER TABLE [dbo].[T_CARD_CRD] CHECK CONSTRAINT [FK_T_CARD_CRD_T_GIFT_GFT] GO ALTER TABLE [dbo].[T_CARD_CRD] WITH CHECK ADD CONSTRAINT [FK_T_CARD_CRD_T_TYPE_CARD_TCA] FOREIGN KEY([TCA_ID]) REFERENCES [dbo].[T_TYPE_CARD_TCA] ([TCA_ID]) GO ALTER TABLE [dbo].[T_CARD_CRD] CHECK CONSTRAINT [FK_T_CARD_CRD_T_TYPE_CARD_TCA] GO ALTER TABLE [dbo].[T_CARD_CRD] ADD CONSTRAINT [DF_T_CARD_CRD_CRD_PREFIX] DEFAULT ((24)) FOR [CRD_PREFIX] GO
Merci d'avance.
EDIT :
Précision car j'ai pas l'impression que c'est très clair à la relecture.
J'aimerais arriver au final à une procédure de ce genre là :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 CREATE PROCEDURE UP_CARD_LIST_INSERT @LIST CARD_LIST BEGIN SET NOCOUNT ON; --insertion de x ligne dans la table T_GIFT_GFT INSERT INTO DBO.T_GIFT_GFT DEFAULT VALUES; --comment spécifier le nombre de fois ? je fais une simple boucle ou bien il y a un truc? INSERT INTO DBO.T_CARD_CRD(GFT_ID, CRD_PREFIX, TCA_ID, CRD_SERIAL, CRD_RECHARGEABLE) SELECT GFT_ID,--où récupérer cette donnée? '24', L.TCA_ID, L.CRD_SERIAL, L.CRD_RECHARGEABLE FROM @LIST; END
Partager