Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/06/2011, 10h39   #1
Nouveau Membre du Club
 
Inscription : décembre 2008
Messages : 63
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France

Informations forums :
Inscription : décembre 2008
Messages : 63
Points : 27
Points : 27
Par défaut 2 INSERT dans un WHILE

Bonjour ,

Je souhaiterais savoir s'il est conseillé de faire 2 INSERT dans 2 tables différentes dans une boucle WHILE.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
	SET @Idx = 1
 
	WHILE (@Idx <= @Nombre_Copies)
	BEGIN
 
		INSERT INTO SOTRIGGERTAGHD(
		TGTSYSTEMCOD, TGTDOCTYP, TGTPARAMVALUE, TGTCOPIESNB, TGTPRINTER, 
		TGTSHSTATUS, TGTUPDATEDDT, TGTPROG, TGTUSERCOD)
		VALUES(
		@Prefixe_Id_Etiquette + CAST(@No_Etiquette AS VARCHAR), @Type_Document, @Parametres, @Nombre_Copies, @Identifiant_Imprimante, 
		@Edition_Statut_Attente, GETDATE(), @Dialogue, @Operateur)
 
		INSERT INTO SOTRIGGERDIALOGHD(TGDIPADDR, TGDMESSAGE, TGDSHSTATUS)
		VALUES('127.0.0.1', @Prefixe_Id_Etiquette + CAST(@No_Etiquette AS VARCHAR), @Edition_Statut_Attente)
 
		SET @Idx = @Idx + 1
	END
Que me conseillez-vous ?

Blacknounou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2011, 10h52   #2
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour,

Il est plutôt conseillé d'éviter ce genre de boucles.

Vous n'avez pas mis le code entier, mais visiblement le but est d’insérer plusieurs fois (un nombre prédéfini) la même ligne...

préférez insérer 1 fois N lignes que N fois 1 ligne...
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2011, 10h59   #3
Membre chevronné
 
Inscription : juillet 2006
Messages : 1 194
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 1 194
Points : 746
Points : 746
Citation:
Envoyé par aieeeuuuuu Voir le message
Bonjour,

Il est plutôt conseillé d'éviter ce genre de boucles.

Vous n'avez pas mis le code entier, mais visiblement le but est d’insérer plusieurs fois (un nombre prédéfini) la même ligne...

préférez insérer 1 fois N lignes que N fois 1 ligne...
En complément d'information, vous devriez employer une table de nombres (il existe plusieurs façon d'en faire, cherchez, vous trouverez).

Votre query deviendrait, grosso-modo :
Code :
1
2
3
4
5
6
 
-- Rajout de 1000 lignes
INSERT maTable ( colonne1, ...)
SELECT valeur1, ...
FROM TableDeNombre
WHERE TableDeNombre.numero BETWEEN 1 AND 1000
Sergejack est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 16/06/2011, 11h18   #4
Rédacteur/Modérateur

 
Avatar de WOLO Laurent
 
Homme Laurent WOLO
Architecte de base de données
Inscription : mars 2003
Messages : 2 696
Détails du profil
Informations personnelles :
Nom : Homme Laurent WOLO
Âge : 35
Localisation : Congo-Brazzaville

Informations professionnelles :
Activité : Architecte de base de données
Secteur : Finance

Informations forums :
Inscription : mars 2003
Messages : 2 696
Points : 3 917
Points : 3 917
Envoyer un message via Yahoo à WOLO Laurent
Une solution proposée par l'actuel responsable de la rubrique SQL Serveur que j'ai aimé.

Code :
1
2
3
4
SELECT DISTINCT Number
FROM dbo.spt_values
WHERE Number BETWEEN 0 AND 1000 
ORDER BY 1
__________________

Découvrez la FAQ de MS SQL Server.
La chance accorde ses faveurs aux esprits avertis !
WOLO Laurent est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 16/06/2011, 11h19   #5
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
oui,

voire aussi utiliser n'importe quelle table dont le nombre de lignes sera toujours plus grand que @Nombre_Copies (sinon, faire un produit cartésien) :

Sur le principe :
Code SQL :
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
 
INSERT INTO SOTRIGGERTAGHD(
	TGTSYSTEMCOD, 
	TGTDOCTYP, 
	TGTPARAMVALUE, 
	TGTCOPIESNB, 
	TGTPRINTER, 
	TGTSHSTATUS, 
	TGTUPDATEDDT, 
	TGTPROG, 
	TGTUSERCOD
)
SELECT TOP(@Nombre_Copies)
	@Prefixe_Id_Etiquette + CAST(@No_Etiquette AS VARCHAR), 
	@Type_Document, 
	@Parametres, 
	@Nombre_Copies, 
	@Identifiant_Imprimante, 
	@Edition_Statut_Attente, 
	GETDATE(), 
	@Dialogue, 
	@Operateur
)
FROM sys.all_columns
CROSS JOIN sys.all_columns
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2011, 11h23   #6
Nouveau Membre du Club
 
Inscription : décembre 2008
Messages : 63
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France

Informations forums :
Inscription : décembre 2008
Messages : 63
Points : 27
Points : 27
Citation:
Envoyé par aieeeuuuuu Voir le message
Bonjour,

préférez insérer 1 fois N lignes que N fois 1 ligne...
Vous avez tout à fait raison.

Effectivement la proc stockée gère ligne par ligne.
Comment pourrais - je en un insert, sélectionner les bonnes lignes.

Ci-dessous le code en entier :

Code :
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
 
ALTER PROCEDURE [dbo].[G_Edition_Etiquette]
	@Type_Document			VARCHAR(10),
	@Parametres				VARCHAR(255),
	@Nombre_Copies			INT,
	@Identifiant_Imprimante	VARCHAR(60),
	@Dialogue				VARCHAR(10),
	@Operateur				VARCHAR(12)
AS
 
-- SET @ParamEtiqTRSP = 'TRSC' + '¤' + E0045051
 
--exec G_Edition_Etiquette 'TRSP',@ParamEtiqTRSP , 1, @ImpETQ, @Dialogue, @Operateur
--exec G_Edition_Etiquette 'TRSP',TRSC¤E0045051 , 1, 8, ESCP, 49808
 
--Constantes
DECLARE @Prefixe_Id_Etiquette					VARCHAR(50)	
 
--Variables
DECLARE @No_Etiquette							INT
DECLARE @TypeEtiquette							VARCHAR(5)
DECLARE @Edition_Statut_Attente					VARCHAR(3)
DECLARE	@Idx									INT
 
BEGIN
	--Initialisation des constantes
	SET @Prefixe_Id_Etiquette = 'ETIQ_'
 
	-- Lancement de la demande d'édition 
	EXEC G_Format_Compteur 'ETIQUETTE', 'P', '0', 0, @Dialogue, @Operateur, @No_Etiquette OUTPUT
 
	-- Sélection du N° d'étiquette
 
	SELECT @No_Etiquette
 
 
	SET @Edition_Statut_Attente = '0'
 
	IF (@Type_Document = 'TRSP') AND (@Dialogue <> 'REED')
	BEGIN
		--Récupération du type de transporteur : GLS par rapport au numéro de colis 'E0045051'
		SELECT @TypeEtiquette = CNHPROP004 FROM SKCONTAINERHD WHERE CNHCONT = dbo.G_Decoupe_Chaine(@Parametres, 2, '¤')
		-- @TypeEtiquette = GLS
 
		-- Si transporteur = GLS 
		IF (@TypeEtiquette = 'GLS')
			SET @Edition_Statut_Attente = '5'
	END
 
	SET @Idx = 1
 
	WHILE (@Idx <= @Nombre_Copies)
	BEGIN
 
		INSERT INTO SOTRIGGERTAGHD(
		TGTSYSTEMCOD, TGTDOCTYP, TGTPARAMVALUE, TGTCOPIESNB, TGTPRINTER, 
		TGTSHSTATUS, TGTUPDATEDDT, TGTPROG, TGTUSERCOD)
		VALUES(
		@Prefixe_Id_Etiquette + CAST(@No_Etiquette AS VARCHAR), @Type_Document, @Parametres, @Nombre_Copies, @Identifiant_Imprimante, 
		@Edition_Statut_Attente, GETDATE(), @Dialogue, @Operateur)
 
		-- Lancement du dialogue d'édition par le SCAP COMMPC
		INSERT INTO SOTRIGGERDIALOGHD(TGDIPADDR, TGDMESSAGE, TGDSHSTATUS)
		VALUES('127.0.0.1', @Prefixe_Id_Etiquette + CAST(@No_Etiquette AS VARCHAR), @Edition_Statut_Attente)
 
		SET @Idx = @Idx + 1
	END		
 
END
Blacknounou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2011, 12h34   #7
Rédacteur/Modérateur

 
Avatar de WOLO Laurent
 
Homme Laurent WOLO
Architecte de base de données
Inscription : mars 2003
Messages : 2 696
Détails du profil
Informations personnelles :
Nom : Homme Laurent WOLO
Âge : 35
Localisation : Congo-Brazzaville

Informations professionnelles :
Activité : Architecte de base de données
Secteur : Finance

Informations forums :
Inscription : mars 2003
Messages : 2 696
Points : 3 917
Points : 3 917
Envoyer un message via Yahoo à WOLO Laurent
Si vous êtes sous SQL Serveur 2000 et 2005, vous pouvez passer en paramètre un tableau de paramètre via XML tandis qu'une méthode plus élégante existe sous SQL Serveur 2008, les TVP (Table Valued Parameters).
C'est à vous de voir.
__________________

Découvrez la FAQ de MS SQL Server.
La chance accorde ses faveurs aux esprits avertis !
WOLO Laurent est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2011, 13h40   #8
Nouveau Membre du Club
 
Inscription : décembre 2008
Messages : 63
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France

Informations forums :
Inscription : décembre 2008
Messages : 63
Points : 27
Points : 27
Citation:
Envoyé par aieeeuuuuu Voir le message
Vous n'avez pas mis le code entier, mais visiblement le but est d’insérer plusieurs fois (un nombre prédéfini) la même ligne...
Le but est d'inséré des plusieurs lignes dans 2 tables différentes.

Exemple :

Ligne 1 dans Table 1 et Table 2
Ligne 2 dans Table 1 et Table 2
Ligne 3 dans Table 1 et Table 2
Blacknounou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2011, 14h05   #9
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Insérer dans deux tables différentes = deux ordres INSERT (y a-t-il des contraintes sur vos tables, sinon vous pouvez jouer sur la clause OUTPUT, mais il me semble préférable de faire 2 insert)

par contre, vous pouvez insérer toutes vos lignes avec un seul ordre SQL. à partir de votre exemple, ce serait donc :

Insertion Ligne 1, ligne 2 et ligne 3 dans table 1
Insertion Ligne 1, ligne 2 et ligne 3 dans table 2

donc sans boucle.
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2011, 14h52   #10
Nouveau Membre du Club
 
Inscription : décembre 2008
Messages : 63
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France

Informations forums :
Inscription : décembre 2008
Messages : 63
Points : 27
Points : 27
Citation:
Envoyé par aieeeuuuuu Voir le message

par contre, vous pouvez insérer toutes vos lignes avec un seul ordre SQL. à partir de votre exemple, ce serait donc :

Insertion Ligne 1, ligne 2 et ligne 3 dans table 1
Insertion Ligne 1, ligne 2 et ligne 3 dans table 2

donc sans boucle.
C'est ce que j'ai fait et ça fonctionne !!!!

Merci encore pour vos réponse.
Blacknounou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2011, 15h00   #11
Rédacteur/Modérateur

 
Avatar de WOLO Laurent
 
Homme Laurent WOLO
Architecte de base de données
Inscription : mars 2003
Messages : 2 696
Détails du profil
Informations personnelles :
Nom : Homme Laurent WOLO
Âge : 35
Localisation : Congo-Brazzaville

Informations professionnelles :
Activité : Architecte de base de données
Secteur : Finance

Informations forums :
Inscription : mars 2003
Messages : 2 696
Points : 3 917
Points : 3 917
Envoyer un message via Yahoo à WOLO Laurent
Effectivement ca ne change rien au principe de banir du procédure au profit de l'ensembliste.
__________________

Découvrez la FAQ de MS SQL Server.
La chance accorde ses faveurs aux esprits avertis !
WOLO Laurent est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h28.


 
 
 
 
Partenaires

Hébergement Web