IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

2 INSERT dans un WHILE


Sujet :

Développement SQL Server

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Décembre 2008
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 101
    Points : 88
    Points
    88
    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 : 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
     
    	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 ?

    Errare Humanum Est ...

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    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...

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    -- Rajout de 1000 lignes
    INSERT maTable ( colonne1, ...)
    SELECT valeur1, ...
    FROM TableDeNombre
    WHERE TableDeNombre.numero BETWEEN 1 AND 1000
    Most Valued Pas mvp

  4. #4
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Congo-Brazzaville

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

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Points : 4 414
    Points
    4 414
    Par défaut
    Une solution proposée par l'actuel responsable de la rubrique SQL Serveur que j'ai aimé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 !

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    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 : 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
     
    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

  6. #6
    Membre régulier
    Homme Profil pro
    Inscrit en
    Décembre 2008
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 101
    Points : 88
    Points
    88
    Par défaut
    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 : 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
    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
    Errare Humanum Est ...

  7. #7
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Congo-Brazzaville

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

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Points : 4 414
    Points
    4 414
    Par défaut
    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 !

  8. #8
    Membre régulier
    Homme Profil pro
    Inscrit en
    Décembre 2008
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 101
    Points : 88
    Points
    88
    Par défaut
    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
    Errare Humanum Est ...

  9. #9
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    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.

  10. #10
    Membre régulier
    Homme Profil pro
    Inscrit en
    Décembre 2008
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 101
    Points : 88
    Points
    88
    Par défaut
    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.
    Errare Humanum Est ...

  11. #11
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Congo-Brazzaville

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

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Points : 4 414
    Points
    4 414
    Par défaut
    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 !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [ODBC] ODBC Access+ requete insert dans boucle while
    Par gpaca dans le forum PHP & Base de données
    Réponses: 0
    Dernier message: 17/03/2010, 16h41
  2. [LG]Tri par insertion dans une liste chainée
    Par mister_dsg dans le forum Langage
    Réponses: 4
    Dernier message: 18/12/2003, 22h34
  3. Insertion dans un fichier xml à partir d'un xsl
    Par alexandre54 dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 21/03/2003, 09h45
  4. Insertion dans un fichier XML
    Par [DreaMs] dans le forum XMLRAD
    Réponses: 4
    Dernier message: 27/02/2003, 17h16
  5. Réponses: 3
    Dernier message: 25/11/2002, 14h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo