Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

requête dynamique

4 réponses
Avatar
Pierre-Yves
Bonjour,
voici le traitement que je souhaite mettre dans ma procédure stockée: Je
veux alimenter ma table destination à partir de ma table source. Dans ma
table source, il y a un enregistrement par article et les qtés sont
ventilées pour chaque semaine. Dans ma table destination, il y a un
enregistrement par article et par semaine

table source : article MS0 MS1 MS2 .... MS52
(table2) A 50 30 65

table destination : article sem qte
(table1) A 0 50
A 1 30
A 2 65

code que j'ai essayé dans ma procédure stockée:
SET @cpt = 0

WHILE @cpt < 53

BEGIN

SET @cptstr=cast(@cpt as varchar(3))

SET @sql = 'INSERT INTO table1 (article, sem, qte)
SELECT article,' +@cptstr+ ', MS'+@cptstr+
' FROM Table2
WHERE typeLigne = ''5PREV'' and
prevision = 1'

EXEC (@sql)

SET @cpt = @cpt+1

END

Ce code fonctionne. En revanche, au niveau des performances c'est pas
génial. Je pense que cela vient du fait que la procédure n'est pas compilée
(sql dynamique)
Y aurait-il un autre moyen de faire ce traitement pour éviter du sql
dynamique? et donc améliorer les performances

merci pour votre analyse

4 réponses

Avatar
Steve Kass
Pierre-Yves,

N'utilisez qu'une seule requête SELECT .. INTO, avec une table de
nombres entiers. (Vous n'avez pas expliqué 5PREV et [prevision]...)

select
article,
i,
case
when i = 0 then MS0
when i = 1 then MS1
when i = 2 then MS2
...
when i = 52 then MS52 end
into destination
from source, (
select ProductID-1 from Northwind..Products
where ProductID between 1 and 53
) N53

-- puis créer les indexes, etc.

[pas testée]

Steve Kass
Drew University

Pierre-Yves wrote:

Bonjour,
voici le traitement que je souhaite mettre dans ma procédure stockée: Je
veux alimenter ma table destination à partir de ma table source. Dans ma
table source, il y a un enregistrement par article et les qtés sont
ventilées pour chaque semaine. Dans ma table destination, il y a un
enregistrement par article et par semaine

table source : article MS0 MS1 MS2 .... MS52
(table2) A 50 30 65

table destination : article sem qte
(table1) A 0 50
A 1 30
A 2 65

code que j'ai essayé dans ma procédure stockée:
SET @cpt = 0

WHILE @cpt < 53

BEGIN

SET @cptstrÊst(@cpt as varchar(3))

SET @sql = 'INSERT INTO table1 (article, sem, qte)
SELECT article,' +@cptstr+ ', MS'+@cptstr+
' FROM Table2
WHERE typeLigne = ''5PREV'' and
prevision = 1'

EXEC (@sql)

SET @cpt = @cpt+1

END

Ce code fonctionne. En revanche, au niveau des performances c'est pas
génial. Je pense que cela vient du fait que la procédure n'est pas compilée
(sql dynamique)
Y aurait-il un autre moyen de faire ce traitement pour éviter du sql
dynamique? et donc améliorer les performances

merci pour votre analyse







Avatar
Pierre-Yves
Il faut tout de même faire une boucle WHILE pour incrémenter le i?
je ne vois pas bien à quoi sert le table N53


"Steve Kass" a écrit dans le message de
news:
Pierre-Yves,

N'utilisez qu'une seule requête SELECT .. INTO, avec une table de
nombres entiers. (Vous n'avez pas expliqué 5PREV et [prevision]...)

select
article,
i,
case
when i = 0 then MS0
when i = 1 then MS1
when i = 2 then MS2
...
when i = 52 then MS52 end
into destination
from source, (
select ProductID-1 from Northwind..Products
where ProductID between 1 and 53
) N53

-- puis créer les indexes, etc.

[pas testée]

Steve Kass
Drew University

Pierre-Yves wrote:

>Bonjour,
>voici le traitement que je souhaite mettre dans ma procédure stockée: Je
>veux alimenter ma table destination à partir de ma table source. Dans ma
>table source, il y a un enregistrement par article et les qtés sont
>ventilées pour chaque semaine. Dans ma table destination, il y a un
>enregistrement par article et par semaine
>
>table source : article MS0 MS1 MS2 .... MS52
>(table2) A 50 30 65
>
>table destination : article sem qte
>(table1) A 0 50
> A 1 30
> A 2 65
>
>code que j'ai essayé dans ma procédure stockée:
>SET @cpt = 0
>
>WHILE @cpt < 53
>
>BEGIN
>
> SET @cptstrÊst(@cpt as varchar(3))
>
> SET @sql = 'INSERT INTO table1 (article, sem, qte)
> SELECT article,' +@cptstr+ ', MS'+@cptstr+
> ' FROM Table2
> WHERE typeLigne = ''5PREV'' and
> prevision = 1'
>
> EXEC (@sql)
>
> SET @cpt = @cpt+1
>
>END
>
>Ce code fonctionne. En revanche, au niveau des performances c'est pas
>génial. Je pense que cela vient du fait que la procédure n'est pas


compilée
>(sql dynamique)
>Y aurait-il un autre moyen de faire ce traitement pour éviter du sql
>dynamique? et donc améliorer les performances
>
>merci pour votre analyse
>
>
>
>
>


Avatar
Pierre-Yves
OK j'ai compris, cela fonctionne bien

Désormais, je veux faire le traitement inverse
table source : article sem qte
(table1) A 0 50
A 1 30
A 2 65

table destination : article MS0 MS1 MS2 .... MS52
(table2) A 50 30 65

je veux alimenter la table destination à partir de la table source
J'ai réussi en faisant de la requête dynamique (insert puis update) mais ce
n'est pas performant.
Quelle autre solution me proposez-vous?

merci pour vos conseils



----- Original Message -----
From: "Pierre-Yves"
Newsgroups: microsoft.public.fr.sqlserver
Sent: Thursday, August 05, 2004 8:58 AM
Subject: Re: requête dynamique


Il faut tout de même faire une boucle WHILE pour incrémenter le i?
je ne vois pas bien à quoi sert le table N53


"Steve Kass" a écrit dans le message de
news:
> Pierre-Yves,
>
> N'utilisez qu'une seule requête SELECT .. INTO, avec une table de
> nombres entiers. (Vous n'avez pas expliqué 5PREV et [prevision]...)
>
> select
> article,
> i,
> case
> when i = 0 then MS0
> when i = 1 then MS1
> when i = 2 then MS2
> ...
> when i = 52 then MS52 end
> into destination
> from source, (
> select ProductID-1 from Northwind..Products
> where ProductID between 1 and 53
> ) N53
>
> -- puis créer les indexes, etc.
>
> [pas testée]
>
> Steve Kass
> Drew University
>
> Pierre-Yves wrote:
>
> >Bonjour,
> >voici le traitement que je souhaite mettre dans ma procédure stockée:


Je
> >veux alimenter ma table destination à partir de ma table source. Dans


ma
> >table source, il y a un enregistrement par article et les qtés sont
> >ventilées pour chaque semaine. Dans ma table destination, il y a un
> >enregistrement par article et par semaine
> >
> >table source : article MS0 MS1 MS2 .... MS52
> >(table2) A 50 30 65
> >
> >table destination : article sem qte
> >(table1) A 0 50
> > A 1 30
> > A 2 65
> >
> >code que j'ai essayé dans ma procédure stockée:
> >SET @cpt = 0
> >
> >WHILE @cpt < 53
> >
> >BEGIN
> >
> > SET @cptstrÊst(@cpt as varchar(3))
> >
> > SET @sql = 'INSERT INTO table1 (article, sem, qte)
> > SELECT article,' +@cptstr+ ', MS'+@cptstr+
> > ' FROM Table2
> > WHERE typeLigne = ''5PREV'' and
> > prevision = 1'
> >
> > EXEC (@sql)
> >
> > SET @cpt = @cpt+1
> >
> >END
> >
> >Ce code fonctionne. En revanche, au niveau des performances c'est pas
> >génial. Je pense que cela vient du fait que la procédure n'est pas
compilée
> >(sql dynamique)
> >Y aurait-il un autre moyen de faire ce traitement pour éviter du sql
> >dynamique? et donc améliorer les performances
> >
> >merci pour votre analyse
> >
> >
> >
> >
> >





"Pierre-Yves" a écrit dans le message de
news:
Il faut tout de même faire une boucle WHILE pour incrémenter le i?
je ne vois pas bien à quoi sert le table N53


"Steve Kass" a écrit dans le message de
news:
> Pierre-Yves,
>
> N'utilisez qu'une seule requête SELECT .. INTO, avec une table de
> nombres entiers. (Vous n'avez pas expliqué 5PREV et [prevision]...)
>
> select
> article,
> i,
> case
> when i = 0 then MS0
> when i = 1 then MS1
> when i = 2 then MS2
> ...
> when i = 52 then MS52 end
> into destination
> from source, (
> select ProductID-1 from Northwind..Products
> where ProductID between 1 and 53
> ) N53
>
> -- puis créer les indexes, etc.
>
> [pas testée]
>
> Steve Kass
> Drew University
>
> Pierre-Yves wrote:
>
> >Bonjour,
> >voici le traitement que je souhaite mettre dans ma procédure stockée:


Je
> >veux alimenter ma table destination à partir de ma table source. Dans


ma
> >table source, il y a un enregistrement par article et les qtés sont
> >ventilées pour chaque semaine. Dans ma table destination, il y a un
> >enregistrement par article et par semaine
> >
> >table source : article MS0 MS1 MS2 .... MS52
> >(table2) A 50 30 65
> >
> >table destination : article sem qte
> >(table1) A 0 50
> > A 1 30
> > A 2 65
> >
> >code que j'ai essayé dans ma procédure stockée:
> >SET @cpt = 0
> >
> >WHILE @cpt < 53
> >
> >BEGIN
> >
> > SET @cptstrÊst(@cpt as varchar(3))
> >
> > SET @sql = 'INSERT INTO table1 (article, sem, qte)
> > SELECT article,' +@cptstr+ ', MS'+@cptstr+
> > ' FROM Table2
> > WHERE typeLigne = ''5PREV'' and
> > prevision = 1'
> >
> > EXEC (@sql)
> >
> > SET @cpt = @cpt+1
> >
> >END
> >
> >Ce code fonctionne. En revanche, au niveau des performances c'est pas
> >génial. Je pense que cela vient du fait que la procédure n'est pas
compilée
> >(sql dynamique)
> >Y aurait-il un autre moyen de faire ce traitement pour éviter du sql
> >dynamique? et donc améliorer les performances
> >
> >merci pour votre analyse
> >
> >
> >
> >
> >




Avatar
Steve Kass
Pierre-Yves,

select
article,
max(case when sem = 0 then qte end) as MS0,
max(case when sem = 1 then qte end) as MS1,
...
max(case when sem = 52 then qte end) as MS52
from source
group by article

Si la table source n'est pas complete, vous verrez des NULLs. Pour y
afficher 0, écrivez

...case when sem = 0 then qte else 0 end, et changer max() à sum() si la
qte peut être négative.

SK

Pierre-Yves wrote:

OK j'ai compris, cela fonctionne bien

Désormais, je veux faire le traitement inverse
table source : article sem qte
(table1) A 0 50
A 1 30
A 2 65

table destination : article MS0 MS1 MS2 .... MS52
(table2) A 50 30 65

je veux alimenter la table destination à partir de la table source
J'ai réussi en faisant de la requête dynamique (insert puis update) mais ce
n'est pas performant.
Quelle autre solution me proposez-vous?

merci pour vos conseils



----- Original Message -----
From: "Pierre-Yves"
Newsgroups: microsoft.public.fr.sqlserver
Sent: Thursday, August 05, 2004 8:58 AM
Subject: Re: requête dynamique




Il faut tout de même faire une boucle WHILE pour incrémenter le i?
je ne vois pas bien à quoi sert le table N53


"Steve Kass" a écrit dans le message de
news:


Pierre-Yves,

N'utilisez qu'une seule requête SELECT .. INTO, avec une table de
nombres entiers. (Vous n'avez pas expliqué 5PREV et [prevision]...)

select
article,
i,
case
when i = 0 then MS0
when i = 1 then MS1
when i = 2 then MS2
...
when i = 52 then MS52 end
into destination
from source, (
select ProductID-1 from Northwind..Products
where ProductID between 1 and 53
) N53

-- puis créer les indexes, etc.

[pas testée]

Steve Kass
Drew University

Pierre-Yves wrote:



Bonjour,
voici le traitement que je souhaite mettre dans ma procédure stockée:








Je


veux alimenter ma table destination à partir de ma table source. Dans








ma


table source, il y a un enregistrement par article et les qtés sont
ventilées pour chaque semaine. Dans ma table destination, il y a un
enregistrement par article et par semaine

table source : article MS0 MS1 MS2 .... MS52
(table2) A 50 30 65

table destination : article sem qte
(table1) A 0 50
A 1 30
A 2 65

code que j'ai essayé dans ma procédure stockée:
SET @cpt = 0

WHILE @cpt < 53

BEGIN

SET @cptstrÊst(@cpt as varchar(3))

SET @sql = 'INSERT INTO table1 (article, sem, qte)
SELECT article,' +@cptstr+ ', MS'+@cptstr+
' FROM Table2
WHERE typeLigne = ''5PREV'' and
prevision = 1'

EXEC (@sql)

SET @cpt = @cpt+1

END

Ce code fonctionne. En revanche, au niveau des performances c'est pas
génial. Je pense que cela vient du fait que la procédure n'est pas






compilée


(sql dynamique)
Y aurait-il un autre moyen de faire ce traitement pour éviter du sql
dynamique? et donc améliorer les performances

merci pour votre analyse
















"Pierre-Yves" a écrit dans le message de
news:


Il faut tout de même faire une boucle WHILE pour incrémenter le i?
je ne vois pas bien à quoi sert le table N53


"Steve Kass" a écrit dans le message de
news:


Pierre-Yves,

N'utilisez qu'une seule requête SELECT .. INTO, avec une table de
nombres entiers. (Vous n'avez pas expliqué 5PREV et [prevision]...)

select
article,
i,
case
when i = 0 then MS0
when i = 1 then MS1
when i = 2 then MS2
...
when i = 52 then MS52 end
into destination
from source, (
select ProductID-1 from Northwind..Products
where ProductID between 1 and 53
) N53

-- puis créer les indexes, etc.

[pas testée]

Steve Kass
Drew University

Pierre-Yves wrote:



Bonjour,
voici le traitement que je souhaite mettre dans ma procédure stockée:








Je


veux alimenter ma table destination à partir de ma table source. Dans








ma


table source, il y a un enregistrement par article et les qtés sont
ventilées pour chaque semaine. Dans ma table destination, il y a un
enregistrement par article et par semaine

table source : article MS0 MS1 MS2 .... MS52
(table2) A 50 30 65

table destination : article sem qte
(table1) A 0 50
A 1 30
A 2 65

code que j'ai essayé dans ma procédure stockée:
SET @cpt = 0

WHILE @cpt < 53

BEGIN

SET @cptstrÊst(@cpt as varchar(3))

SET @sql = 'INSERT INTO table1 (article, sem, qte)
SELECT article,' +@cptstr+ ', MS'+@cptstr+
' FROM Table2
WHERE typeLigne = ''5PREV'' and
prevision = 1'

EXEC (@sql)

SET @cpt = @cpt+1

END

Ce code fonctionne. En revanche, au niveau des performances c'est pas
génial. Je pense que cela vient du fait que la procédure n'est pas






compilée


(sql dynamique)
Y aurait-il un autre moyen de faire ce traitement pour éviter du sql
dynamique? et donc améliorer les performances

merci pour votre analyse