OVH Cloud OVH Cloud

insertin dans 2 tables liées

5 réponses
Avatar
HPA
Bonjour,
je dois insérer un jeu d'enregistrement (env. 150 000 lignes) dans 2 tables
liées par une relation d'héritage.
La clé primaire de la table mère est une colonne identité, celle de la table
fille un entier long qui hérite de la clé précédente.
Est-ce qu'il est possible de réaliser un traitement par lot qui insèrerait
les enregistrement liés dans les 2 tables sans utiliser de curseur (qui
affecterait trop négativement les performances) et qui reproduirait ainsi ce
que permet le moteur d'Access lorsqu'on insère une ligne dans une requêt
mêlant 2 tables de ce type ?

Merci pour votre réponse.
Cordialement,

5 réponses

Avatar
Fred BROUARD
Il suffit de créer une procédure stockée.

Sans autre renseignement difficile de t'en dire plus.

A +

HPA a écrit:
Bonjour,
je dois insérer un jeu d'enregistrement (env. 150 000 lignes) dans 2 tables
liées par une relation d'héritage.
La clé primaire de la table mère est une colonne identité, celle de la table
fille un entier long qui hérite de la clé précédente.
Est-ce qu'il est possible de réaliser un traitement par lot qui insèrerait
les enregistrement liés dans les 2 tables sans utiliser de curseur (qui
affecterait trop négativement les performances) et qui reproduirait ainsi ce
que permet le moteur d'Access lorsqu'on insère une ligne dans une requêt
mêlant 2 tables de ce type ?

Merci pour votre réponse.
Cordialement,





--
Frédéric BROUARD, MVP Microsoft SQL Server. Langage SQL / Delphi / web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
****************** mailto: ******************
Avatar
HPA
Shématiquement :
- la table maTableDeChargement contient des colonnes à "éclater" entre les
tables mere et filles reliées par un héritage ;
- les tables mere et fille contiennet déjà des données ;
je voudrais reproduire cette instruction pour chaque ligne de
maTableDeChargement :

begin transaction
insert into mere(col1)
select colChargement1
from maTableDeChargement

insert into fille(id, col2)
select @@identity , colChargement2
from maTableDeChargement
commit transaction

Je souhaiterais écrire quelque chose de ce genre pour les 150000 lignes de
maTableDeChargement sans avoir à imbriquer ça dans un curseur qui
parcourerait maTableDeChargement ligne par ligne.
Cordialement,


"Fred BROUARD" a écrit dans le message de
news:OCUDt7e%
Il suffit de créer une procédure stockée.

Sans autre renseignement difficile de t'en dire plus.

A +

HPA a écrit:
> Bonjour,
> je dois insérer un jeu d'enregistrement (env. 150 000 lignes) dans 2


tables
> liées par une relation d'héritage.
> La clé primaire de la table mère est une colonne identité, celle de la


table
> fille un entier long qui hérite de la clé précédente.
> Est-ce qu'il est possible de réaliser un traitement par lot qui


insèrerait
> les enregistrement liés dans les 2 tables sans utiliser de curseur (qui
> affecterait trop négativement les performances) et qui reproduirait


ainsi ce
> que permet le moteur d'Access lorsqu'on insère une ligne dans une requêt
> mêlant 2 tables de ce type ?
>
> Merci pour votre réponse.
> Cordialement,
>
>

--
Frédéric BROUARD, MVP Microsoft SQL Server. Langage SQL / Delphi / web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
****************** mailto: ******************



Avatar
Fred BROUARD
Tu peut probablement passer par une vue et un trigger INSTEAD OF

La vue concatène les table mère fille
le trigger éclate l'insertion

A +

HPA a écrit:
Shématiquement :
- la table maTableDeChargement contient des colonnes à "éclater" entre les
tables mere et filles reliées par un héritage ;
- les tables mere et fille contiennet déjà des données ;
je voudrais reproduire cette instruction pour chaque ligne de
maTableDeChargement :

begin transaction
insert into mere(col1)
select colChargement1
from maTableDeChargement

insert into fille(id, col2)
select @@identity , colChargement2
from maTableDeChargement
commit transaction

Je souhaiterais écrire quelque chose de ce genre pour les 150000 lignes de
maTableDeChargement sans avoir à imbriquer ça dans un curseur qui
parcourerait maTableDeChargement ligne par ligne.
Cordialement,


"Fred BROUARD" a écrit dans le message de
news:OCUDt7e%

Il suffit de créer une procédure stockée.

Sans autre renseignement difficile de t'en dire plus.

A +

HPA a écrit:

Bonjour,
je dois insérer un jeu d'enregistrement (env. 150 000 lignes) dans 2





tables

liées par une relation d'héritage.
La clé primaire de la table mère est une colonne identité, celle de la





table

fille un entier long qui hérite de la clé précédente.
Est-ce qu'il est possible de réaliser un traitement par lot qui





insèrerait

les enregistrement liés dans les 2 tables sans utiliser de curseur (qui
affecterait trop négativement les performances) et qui reproduirait





ainsi ce

que permet le moteur d'Access lorsqu'on insère une ligne dans une requêt
mêlant 2 tables de ce type ?

Merci pour votre réponse.
Cordialement,





--
Frédéric BROUARD, MVP Microsoft SQL Server. Langage SQL / Delphi / web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
****************** mailto: ******************









--
Frédéric BROUARD, MVP Microsoft SQL Server. Langage SQL / Delphi / web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
****************** mailto: ******************
Avatar
Med Bouchenafa[MVP]
La solution du trigger ne pourrait pas fonctionner car un trigger ne se
declenche qu'une seule fois en fin de transaction.
Cela aurait été une solution valable si l'on inserait ligne à ligne. Mais
dans le cas présent, c'est ce que l'on cherche à éviter

Je pense plus à une solution "agricole" (l'expression n'est pas de moi)
Cette solution consisterait à créer la table temporaire avec une clef de
type Identity.
Il ne resterait plus alors qu'a insérer directement dans les deux tables
INSERT INTO mere(id, col1) SELECT colIdent, colChargement1 FROM
maTableDeChargement
INSERT INTO fille(id, col2) SELECT colIdent, colChargement2 FROM
maTableDeChargement
La clef de la table temporaire devrait démarrer à la plus grande valeur ID
de la table mère
Avant l'insertion dans la table "mere", il ne faudra pas oublier d'utiliser
SET IDENTITY_INSERT mere ON

J'espère avoir été clair.

--
Bien cordialement
Med Bouchenafa
TETRASET
75015 Paris


"HPA" wrote in message
news:t5k_b.26276$
Shématiquement :
- la table maTableDeChargement contient des colonnes à "éclater" entre les
tables mere et filles reliées par un héritage ;
- les tables mere et fille contiennet déjà des données ;
je voudrais reproduire cette instruction pour chaque ligne de
maTableDeChargement :

begin transaction
insert into mere(col1)
select colChargement1
from maTableDeChargement

insert into fille(id, col2)
select @@identity , colChargement2
from maTableDeChargement
commit transaction

Je souhaiterais écrire quelque chose de ce genre pour les 150000 lignes de
maTableDeChargement sans avoir à imbriquer ça dans un curseur qui
parcourerait maTableDeChargement ligne par ligne.
Cordialement,


"Fred BROUARD" a écrit dans le message de
news:OCUDt7e%
> Il suffit de créer une procédure stockée.
>
> Sans autre renseignement difficile de t'en dire plus.
>
> A +
>
> HPA a écrit:
> > Bonjour,
> > je dois insérer un jeu d'enregistrement (env. 150 000 lignes) dans 2
tables
> > liées par une relation d'héritage.
> > La clé primaire de la table mère est une colonne identité, celle de la
table
> > fille un entier long qui hérite de la clé précédente.
> > Est-ce qu'il est possible de réaliser un traitement par lot qui
insèrerait
> > les enregistrement liés dans les 2 tables sans utiliser de curseur


(qui
> > affecterait trop négativement les performances) et qui reproduirait
ainsi ce
> > que permet le moteur d'Access lorsqu'on insère une ligne dans une


requêt
> > mêlant 2 tables de ce type ?
> >
> > Merci pour votre réponse.
> > Cordialement,
> >
> >
>
> --
> Frédéric BROUARD, MVP Microsoft SQL Server. Langage SQL / Delphi / web
> Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
> Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
> ****************** mailto: ******************
>




Avatar
HPA
Bonjour,
je réponds tardivement... merci pour votre réponse.
J'ai finalement opté pour une solution proche de celle-ci, à la différence
prêt que ma table de chargement ne peut pas recevoir de colonne identité
(elle en possède déjà une) et celle-ci ne peut pas être utilisée car je ne
prends pas toutes les lignes de cette table...
La solution que j'ai retenue a un côté "agricole", mais elle a le mérite
d'être beaucoup plus rapide que le passage par un curseur avec récupération
de la clé auto-incrémentée (et puis le salon de l'agriculture démarre cette
fin de semaine...) :

Schématiquement :
INSERT INTO mere(id, col1) SELECT chargement_id, colChargement1 FROM
maVueDeChargement
CREATE TABLE #correspondance (chargement_id int, mere_id int
identity(@@identity - @@rowcount + 1,1))
INSERT INTO #correspondance(chargement_id) SELECT chargement_id FROM
maVueDeChargement
INSERT INTO fille(id, col2) SELECT #correspondance.mere_id,
colChargement2 FROM maVueDeChargement INNER JOIN #correspondance ON
maVueDeChargement.chargement_id = #correspondance.chargement_id.

Merci encore pour vos réponses.
Cordialement,


"Med Bouchenafa[MVP]" a écrit dans le message de
news:uhtOrUr%
La solution du trigger ne pourrait pas fonctionner car un trigger ne se
declenche qu'une seule fois en fin de transaction.
Cela aurait été une solution valable si l'on inserait ligne à ligne. Mais
dans le cas présent, c'est ce que l'on cherche à éviter

Je pense plus à une solution "agricole" (l'expression n'est pas de moi)
Cette solution consisterait à créer la table temporaire avec une clef de
type Identity.
Il ne resterait plus alors qu'a insérer directement dans les deux tables
INSERT INTO mere(id, col1) SELECT colIdent, colChargement1 FROM
maTableDeChargement
INSERT INTO fille(id, col2) SELECT colIdent, colChargement2 FROM
maTableDeChargement
La clef de la table temporaire devrait démarrer à la plus grande valeur ID
de la table mère
Avant l'insertion dans la table "mere", il ne faudra pas oublier


d'utiliser
SET IDENTITY_INSERT mere ON

J'espère avoir été clair.

--
Bien cordialement
Med Bouchenafa
TETRASET
75015 Paris


"HPA" wrote in message
news:t5k_b.26276$
> Shématiquement :
> - la table maTableDeChargement contient des colonnes à "éclater" entre


les
> tables mere et filles reliées par un héritage ;
> - les tables mere et fille contiennet déjà des données ;
> je voudrais reproduire cette instruction pour chaque ligne de
> maTableDeChargement :
>
> begin transaction
> insert into mere(col1)
> select colChargement1
> from maTableDeChargement
>
> insert into fille(id, col2)
> select @@identity , colChargement2
> from maTableDeChargement
> commit transaction
>
> Je souhaiterais écrire quelque chose de ce genre pour les 150000 lignes


de
> maTableDeChargement sans avoir à imbriquer ça dans un curseur qui
> parcourerait maTableDeChargement ligne par ligne.
> Cordialement,
>
>
> "Fred BROUARD" a écrit dans le message de
> news:OCUDt7e%
> > Il suffit de créer une procédure stockée.
> >
> > Sans autre renseignement difficile de t'en dire plus.
> >
> > A +
> >
> > HPA a écrit:
> > > Bonjour,
> > > je dois insérer un jeu d'enregistrement (env. 150 000 lignes) dans 2
> tables
> > > liées par une relation d'héritage.
> > > La clé primaire de la table mère est une colonne identité, celle de


la
> table
> > > fille un entier long qui hérite de la clé précédente.
> > > Est-ce qu'il est possible de réaliser un traitement par lot qui
> insèrerait
> > > les enregistrement liés dans les 2 tables sans utiliser de curseur
(qui
> > > affecterait trop négativement les performances) et qui reproduirait
> ainsi ce
> > > que permet le moteur d'Access lorsqu'on insère une ligne dans une
requêt
> > > mêlant 2 tables de ce type ?
> > >
> > > Merci pour votre réponse.
> > > Cordialement,
> > >
> > >
> >
> > --
> > Frédéric BROUARD, MVP Microsoft SQL Server. Langage SQL / Delphi / web
> > Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
> > Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
> > ****************** mailto: ******************
> >
>
>