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

[Requête] 4 en 1 !! (4 requêtes insertion en une seule)

5 réponses
Avatar
404 found
Bonjour,
j'ai 4 requêtes insertion qui insèrent dans une table T des données à partir
de cette même table T, voici mes requêtes :

1/ update T1 set Ch1= Ch5 where critere = 2
2/ update T1 set Ch2 = 'D' where Ch5 is not null
3/ update T1 set Ch1 = Ch6 where critere = 2 and Ch1 is null
4/ update T1 set Ch2 = 'C' where Ch2 is null

Alors j'ai 2 champs Ch5 et Ch6 qui sont rensigné soit l'un soit l'autre, je
les importe dans ma table comme ça, je doit mettre à jour mon champs 1 avec
la valeur (de l'un ou de l'autre selon qu'il soit renseigné ou non) et mon
champ 2 aussi en fonction de Ch5 (D) ou Ch6 (C)

en fait avec l'analyseur de requêtes, l'enchainement de mes 4 requêtes
marche (sur une table de 400000 lignes) mais si je fais appel à ces requêtes
les unes derière les autres à partir d'un programme VB, ça plante et j'aurais
"délai de connexion dépassé" !!

Par expérience, je sais que si j'arrive à mettre ce lot de requête dans une
seule, cela va bien marcher mais je n'arrive pas à voir comment je peux le
faire !!

Merci de votre aide !

5 réponses

Avatar
Ch.
alors je ne pense pas que cette methode soit plus rapide mais bon si cela
peut te donner une solution !
update T1 set Ch1 case
when critere = 2 then Ch5
when critere = 2 and Ch1 is null then
Ch6
else Ch1
end
, Ch2 = case
when Ch5 is not null then 'D'
when Ch2 is null then 'C'
else Ch2
end




"404 found" a écrit dans le message de
news:
Bonjour,
j'ai 4 requêtes insertion qui insèrent dans une table T des données à
partir
de cette même table T, voici mes requêtes :

1/ update T1 set Ch1= Ch5 where critere = 2
2/ update T1 set Ch2 = 'D' where Ch5 is not null
3/ update T1 set Ch1 = Ch6 where critere = 2 and Ch1 is null
4/ update T1 set Ch2 = 'C' where Ch2 is null

Alors j'ai 2 champs Ch5 et Ch6 qui sont rensigné soit l'un soit l'autre,
je
les importe dans ma table comme ça, je doit mettre à jour mon champs 1
avec
la valeur (de l'un ou de l'autre selon qu'il soit renseigné ou non) et mon
champ 2 aussi en fonction de Ch5 (D) ou Ch6 (C)

en fait avec l'analyseur de requêtes, l'enchainement de mes 4 requêtes
marche (sur une table de 400000 lignes) mais si je fais appel à ces
requêtes
les unes derière les autres à partir d'un programme VB, ça plante et
j'aurais
"délai de connexion dépassé" !!

Par expérience, je sais que si j'arrive à mettre ce lot de requête dans
une
seule, cela va bien marcher mais je n'arrive pas à voir comment je peux le
faire !!

Merci de votre aide !


Avatar
Fred BROUARD
404 found a écrit:
Bonjour,
j'ai 4 requêtes insertion qui insèrent dans une table T des données à partir
de cette même table T, voici mes requêtes :

1/ update T1 set Ch1= Ch5 where critere = 2
2/ update T1 set Ch2 = 'D' where Ch5 is not null
3/ update T1 set Ch1 = Ch6 where critere = 2 and Ch1 is null
4/ update T1 set Ch2 = 'C' where Ch2 is null

Alors j'ai 2 champs Ch5 et Ch6 qui sont rensigné soit l'un soit l'autre, je
les importe dans ma table comme ça, je doit mettre à jour mon champs 1 avec
la valeur (de l'un ou de l'autre selon qu'il soit renseigné ou non) et mon
champ 2 aussi en fonction de Ch5 (D) ou Ch6 (C)

en fait avec l'analyseur de requêtes, l'enchainement de mes 4 requêtes
marche (sur une table de 400000 lignes) mais si je fais appel à ces requêtes
les unes derière les autres à partir d'un programme VB, ça plante et j'aurais
"délai de connexion dépassé" !!

Par expérience, je sais que si j'arrive à mettre ce lot de requête dans une
seule, cela va bien marcher mais je n'arrive pas à voir comment je peux le
faire !!



Dans une procédure stockée ! C'est fait pour ça :

CREATE PROC P_4INSERT

BEGIN TRANSACTION

update T1 set Ch1= Ch5 where critere = 2
IF @@ERROR <> 0 GOTO LBL_ERROR

update T1 set Ch2 = 'D' where Ch5 is not null
IF @@ERROR <> 0 GOTO LBL_ERROR

update T1 set Ch1 = Ch6 where critere = 2 and Ch1 is null
IF @@ERROR <> 0 GOTO LBL_ERROR

update T1 set Ch2 = 'C' where Ch2 is null
IF @@ERROR <> 0 GOTO LBL_ERROR

COMMITE TRAN
RETURN

LBL_ERROR:
ROLLBACK

GO

du côté client, lancez simplement la commande suivante 'EXEC P_4INSERT' en mode
excute et non open.

Vous pouvez boen entendu passer des paramètres à votre procédure. Lisez le
tutorial que j'ai écrit à ce sujet :
http://sqlpro.developpez.com/cours/sqlserver/transactsql/

A +



Merci de votre aide !



--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
Avatar
404 found
Excellent, merci beaucouppppp

je vais essayer la méthode Procédure stocké !!

"Fred BROUARD" a écrit :



404 found a écrit:
> Bonjour,
> j'ai 4 requêtes insertion qui insèrent dans une table T des données à partir
> de cette même table T, voici mes requêtes :
>
> 1/ update T1 set Ch1= Ch5 where critere = 2
> 2/ update T1 set Ch2 = 'D' where Ch5 is not null
> 3/ update T1 set Ch1 = Ch6 where critere = 2 and Ch1 is null
> 4/ update T1 set Ch2 = 'C' where Ch2 is null
>
> Alors j'ai 2 champs Ch5 et Ch6 qui sont rensigné soit l'un soit l'autre, je
> les importe dans ma table comme ça, je doit mettre à jour mon champs 1 avec
> la valeur (de l'un ou de l'autre selon qu'il soit renseigné ou non) et mon
> champ 2 aussi en fonction de Ch5 (D) ou Ch6 (C)
>
> en fait avec l'analyseur de requêtes, l'enchainement de mes 4 requêtes
> marche (sur une table de 400000 lignes) mais si je fais appel à ces requêtes
> les unes derière les autres à partir d'un programme VB, ça plante et j'aurais
> "délai de connexion dépassé" !!
>
> Par expérience, je sais que si j'arrive à mettre ce lot de requête dans une
> seule, cela va bien marcher mais je n'arrive pas à voir comment je peux le
> faire !!

Dans une procédure stockée ! C'est fait pour ça :

CREATE PROC P_4INSERT

BEGIN TRANSACTION

update T1 set Ch1= Ch5 where critere = 2
IF @@ERROR <> 0 GOTO LBL_ERROR

update T1 set Ch2 = 'D' where Ch5 is not null
IF @@ERROR <> 0 GOTO LBL_ERROR

update T1 set Ch1 = Ch6 where critere = 2 and Ch1 is null
IF @@ERROR <> 0 GOTO LBL_ERROR

update T1 set Ch2 = 'C' where Ch2 is null
IF @@ERROR <> 0 GOTO LBL_ERROR

COMMITE TRAN
RETURN

LBL_ERROR:
ROLLBACK

GO

du côté client, lancez simplement la commande suivante 'EXEC P_4INSERT' en mode
excute et non open.

Vous pouvez boen entendu passer des paramètres à votre procédure. Lisez le
tutorial que j'ai écrit à ce sujet :
http://sqlpro.developpez.com/cours/sqlserver/transactsql/

A +


>
> Merci de votre aide !

--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************




Avatar
404 found
j'ai voulu mettre des paramètres et donc j'ai mis :

CREATE PROC P_4INSERT @LaTable varchar(50), @criteria int
AS
BEGIN TRANSACTION

update @LaTable set Ch1= Ch5 where critere = @Criteria
IF @@ERROR <> 0 GOTO LBL_ERROR

mais j'ai l'erreur : la variable @LaTable doit être déclaré !!

"Fred BROUARD" a écrit :



404 found a écrit:
> Bonjour,
> j'ai 4 requêtes insertion qui insèrent dans une table T des données à partir
> de cette même table T, voici mes requêtes :
>
> 1/ update T1 set Ch1= Ch5 where critere = 2
> 2/ update T1 set Ch2 = 'D' where Ch5 is not null
> 3/ update T1 set Ch1 = Ch6 where critere = 2 and Ch1 is null
> 4/ update T1 set Ch2 = 'C' where Ch2 is null
>
> Alors j'ai 2 champs Ch5 et Ch6 qui sont rensigné soit l'un soit l'autre, je
> les importe dans ma table comme ça, je doit mettre à jour mon champs 1 avec
> la valeur (de l'un ou de l'autre selon qu'il soit renseigné ou non) et mon
> champ 2 aussi en fonction de Ch5 (D) ou Ch6 (C)
>
> en fait avec l'analyseur de requêtes, l'enchainement de mes 4 requêtes
> marche (sur une table de 400000 lignes) mais si je fais appel à ces requêtes
> les unes derière les autres à partir d'un programme VB, ça plante et j'aurais
> "délai de connexion dépassé" !!
>
> Par expérience, je sais que si j'arrive à mettre ce lot de requête dans une
> seule, cela va bien marcher mais je n'arrive pas à voir comment je peux le
> faire !!

Dans une procédure stockée ! C'est fait pour ça :

CREATE PROC P_4INSERT

BEGIN TRANSACTION

update T1 set Ch1= Ch5 where critere = 2
IF @@ERROR <> 0 GOTO LBL_ERROR

update T1 set Ch2 = 'D' where Ch5 is not null
IF @@ERROR <> 0 GOTO LBL_ERROR

update T1 set Ch1 = Ch6 where critere = 2 and Ch1 is null
IF @@ERROR <> 0 GOTO LBL_ERROR

update T1 set Ch2 = 'C' where Ch2 is null
IF @@ERROR <> 0 GOTO LBL_ERROR

COMMITE TRAN
RETURN

LBL_ERROR:
ROLLBACK

GO

du côté client, lancez simplement la commande suivante 'EXEC P_4INSERT' en mode
excute et non open.

Vous pouvez boen entendu passer des paramètres à votre procédure. Lisez le
tutorial que j'ai écrit à ce sujet :
http://sqlpro.developpez.com/cours/sqlserver/transactsql/

A +


>
> Merci de votre aide !

--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************




Avatar
Fred BROUARD
On ne peut pas paramétrer un nom d'objet. Seules des valeurs peuvent être
paramétrées...

CREATE PROC P_4INSERT @criteria int
AS
BEGIN TRANSACTION

update MaTable set Ch1 = Ch5 where critere = @Criteria
IF @@ERROR <> 0 GOTO LBL_ERROR

...

Sinon il faut faire du SQL dynamique.
Exemple :

CREATE PROC P_4INSERT @LaTable sysname, @criteria int
AS
BEGIN TRANSACTION

DECLARE @SQL NVARCHAR(4000)
SET @SQL = 'update ' + @LaTable
+' set Ch1 = Ch5 where critere = ' + CAST(@Criteria AS NVARCHAR(16)
EXEC (@SQL)
IF @@ERROR <> 0 GOTO LBL_ERROR

...

A +

404 found a écrit:
j'ai voulu mettre des paramètres et donc j'ai mis :

CREATE PROC P_4INSERT @LaTable varchar(50), @criteria int
AS
BEGIN TRANSACTION

update @LaTable set Ch1= Ch5 where critere = @Criteria
IF @@ERROR <> 0 GOTO LBL_ERROR

mais j'ai l'erreur : la variable @LaTable doit être déclaré !!

"Fred BROUARD" a écrit :



404 found a écrit:

Bonjour,
j'ai 4 requêtes insertion qui insèrent dans une table T des données à partir
de cette même table T, voici mes requêtes :

1/ update T1 set Ch1= Ch5 where critere = 2
2/ update T1 set Ch2 = 'D' where Ch5 is not null
3/ update T1 set Ch1 = Ch6 where critere = 2 and Ch1 is null
4/ update T1 set Ch2 = 'C' where Ch2 is null

Alors j'ai 2 champs Ch5 et Ch6 qui sont rensigné soit l'un soit l'autre, je
les importe dans ma table comme ça, je doit mettre à jour mon champs 1 avec
la valeur (de l'un ou de l'autre selon qu'il soit renseigné ou non) et mon
champ 2 aussi en fonction de Ch5 (D) ou Ch6 (C)

en fait avec l'analyseur de requêtes, l'enchainement de mes 4 requêtes
marche (sur une table de 400000 lignes) mais si je fais appel à ces requêtes
les unes derière les autres à partir d'un programme VB, ça plante et j'aurais
"délai de connexion dépassé" !!

Par expérience, je sais que si j'arrive à mettre ce lot de requête dans une
seule, cela va bien marcher mais je n'arrive pas à voir comment je peux le
faire !!



Dans une procédure stockée ! C'est fait pour ça :

CREATE PROC P_4INSERT

BEGIN TRANSACTION

update T1 set Ch1= Ch5 where critere = 2
IF @@ERROR <> 0 GOTO LBL_ERROR

update T1 set Ch2 = 'D' where Ch5 is not null
IF @@ERROR <> 0 GOTO LBL_ERROR

update T1 set Ch1 = Ch6 where critere = 2 and Ch1 is null
IF @@ERROR <> 0 GOTO LBL_ERROR

update T1 set Ch2 = 'C' where Ch2 is null
IF @@ERROR <> 0 GOTO LBL_ERROR

COMMITE TRAN
RETURN

LBL_ERROR:
ROLLBACK

GO

du côté client, lancez simplement la commande suivante 'EXEC P_4INSERT' en mode
excute et non open.

Vous pouvez boen entendu passer des paramètres à votre procédure. Lisez le
tutorial que j'ai écrit à ce sujet :
http://sqlpro.developpez.com/cours/sqlserver/transactsql/

A +



Merci de votre aide !



--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************







--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************