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 :

Requête INSERT avec compteur incrémental (sans curseur)


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    FMJ
    FMJ est déconnecté
    Membre éclairé
    Profil pro
    tutu
    Inscrit en
    Octobre 2003
    Messages
    417
    Détails du profil
    Informations personnelles :
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : tutu

    Informations forums :
    Inscription : Octobre 2003
    Messages : 417
    Par défaut Requête INSERT avec compteur incrémental (sans curseur)
    Salut

    Dans un précédent post, j'avais posé une question équivalente, mais pour une requête de type UPDATE. Là il s'agit d'une requête de type INSERT et la méthode proposée par 'aieeeuuuuu' ne peut être utilisée.
    http://www.developpez.net/forums/d13...ental-curseur/

    Il s'agirait donc de faire une requpete d'ajout de ligne, dont l'un des champs est un compteur incrémental (du type 1, 2, 3, ...).

    Initialement, j'avais pensé à utiliser la formulation suivante mais celle-ci n'est pas acceptée par le debbogueur SQL Server 2000 (le "@i=" ne passe pas) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    INSERT INTO MaTable1
    (champ1, champ2)
    SELECT champ1, (select @i=@i+1 FROM MaTable2)
    FROM MaTable3
    WHERE ....
    ORDER BY ...
    Une proposition alternative ?
    Merci d'avance.

  2. #2
    Membre expérimenté
    Avatar de Lyche
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2007
    Messages
    2 523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 523
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    Pouvez-vous redéfinir votre table et rajouter un compteur INDENTITY(1,1) à votre table?

    Si non, un MAX(id)+1.. le soucis de cette méthode c'est qu'on ne peut traiter qu'une ligne à la fois et qu'on s'expose à des doublons en cas de transactions concurentes.

    Cordialement,
    Lyche
    Rejoignez la communauté du chat et partagez vos connaissances ou vos questions avec nous

    Mon Tutoriel pour apprendre les Agregations
    Consultez mon Blog SQL destiné aux débutants

    Pensez à FAQ SQL Server Ainsi qu'aux Cours et Tuto SQL Server

  3. #3
    FMJ
    FMJ est déconnecté
    Membre éclairé
    Profil pro
    tutu
    Inscrit en
    Octobre 2003
    Messages
    417
    Détails du profil
    Informations personnelles :
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : tutu

    Informations forums :
    Inscription : Octobre 2003
    Messages : 417
    Par défaut
    Bonjour,

    Non je ne peux pas toucher à la structure de la table.
    Quant au MAX(), non effectivement cela ne marchera pas car il y a plusieurs lignes à créer et que le compteur sert à combler des numéros chrono vides (donc on ne peut pas partir du dernier numéros chrono par un MAX() ).

    Merci.

  4. #4
    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
    Par défaut
    Bonjour,

    Le plus simple serait... de migrer vers une version plus récente de SQL Server pour disposer des fonctions fenêtrées.

    A défaut, je ne pense pas qu'il y ait d'autre solution que l'auto-jointure pour compter le nombre de lignes qui "précédent" selon l'ordre que vous avez défini...

    Et là encore, votre solution à base de curseur pourrait se révéler plus rapide...

  5. #5
    Membre expérimenté
    Avatar de Lyche
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2007
    Messages
    2 523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 523
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Bonjour,

    Le plus simple serait... de migrer vers une version plus récente de SQL Server pour disposer des fonctions fenêtrées.

    A défaut, je ne pense pas qu'il y ait d'autre solution que l'auto-jointure pour compter le nombre de lignes qui "précédent" selon l'ordre que vous avez défini...

    Et là encore, votre solution à base de curseur pourrait se révéler plus rapide...
    J'ai pensé à créer une table intermédiaire qui elle pourrait être en IDENTITY(1,1) et qui servirait de "base" pour l'ajout d'un ID.

    Mais ça pourrait être un peu lourd à mettre en place ET à maintenir.
    Rejoignez la communauté du chat et partagez vos connaissances ou vos questions avec nous

    Mon Tutoriel pour apprendre les Agregations
    Consultez mon Blog SQL destiné aux débutants

    Pensez à FAQ SQL Server Ainsi qu'aux Cours et Tuto SQL Server

  6. #6
    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
    Par défaut
    Pas forcément, il suffit d'y stocker la clef en plus de la séquence (ainsi générée par la colonne IDENTITY)

    pour le fil précédent, où il est question d'une mise à jour, ça donnerai quelque chose comme ceci :

    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
     
     
    	CREATE TABLE #tmp (
    		id int not null primary key identity(1,1)
    		,champ1 int
    	)
     
    	INSERT INTO #tmp
    		SELECT champ1
    		FROM MaTable
    		ORDER BY Champ1
    	;
     
    	UPDATE T
    		SET champ1 = tmp.id
    	FROM 	MaTable T
    	INNER JOIN #tmp tmp
    		ON tmp.champ1 = T.champ1
     
    	DROP TABLE #tmp
    Donc je ne pense pas que ça soit plus lourd à maintenir qu'avec le curseur...

    Pour un INSERT, le code serait a peu près identique...

    en revanche, je trouve que le INSERT avec un ORDER BY n'est pas très académique...

  7. #7
    FMJ
    FMJ est déconnecté
    Membre éclairé
    Profil pro
    tutu
    Inscrit en
    Octobre 2003
    Messages
    417
    Détails du profil
    Informations personnelles :
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : tutu

    Informations forums :
    Inscription : Octobre 2003
    Messages : 417
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Le plus simple serait... de migrer vers une version plus récente de SQL Server pour disposer des fonctions fenêtrées.

    Là oui, moi je veux bien, je ne demande que ça. L'attente est là, le budget aussi. Mais qu'attend-t-on ??? Simplement que l'éditeur de notre ERP veuille bien prendre la peine de qualifier leur produit sous Win Server 8 et SQL Server 2013 ! Mais ce sont tout sauf des rapides ....

    Citation Envoyé par aieeeuuuuu Voir le message
    Et là encore, votre solution à base de curseur pourrait se révéler plus rapide...
    oui je le crains ...

  8. #8
    FMJ
    FMJ est déconnecté
    Membre éclairé
    Profil pro
    tutu
    Inscrit en
    Octobre 2003
    Messages
    417
    Détails du profil
    Informations personnelles :
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : tutu

    Informations forums :
    Inscription : Octobre 2003
    Messages : 417
    Par défaut
    aieeeuuuuu
    En fait je ne vois pas trop comment adapter ton code à un INSERT. Vu que les lignes n'existent pas, je ne peux pas faire une jointure.

    Par contre, j'ai eu une idée très bête qui s'articule en 2 étapes :

    1. Faire un Insert pour créer les lignes, en affectant à champ1 la valeur (SELECT MAX(champ1) .... pour toutes les lignes de la table).
    Alors pour l'instant, champ1 n'a pas la valeur que l'on souhaite lui donner.

    2. Faire un UPDATE sur ces lignes en donnant à champ1 la valeur souhaitée, comme dans la solution donnée par aieeeuuuuu dans l'autre post.

    Mais là aussi je crains que ce soit plus lente qu'en utilisant un curseur.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 03/12/2013, 16h10
  2. Requête INSERT avec 2 SELECT sans liaison?
    Par kooky dans le forum SQL
    Réponses: 3
    Dernier message: 21/03/2010, 15h57
  3. Pb Requête INSERT avec QBE
    Par jubi73 dans le forum Paradox
    Réponses: 4
    Dernier message: 04/09/2007, 15h20
  4. Requête INSERT avec 2 requêtes sélection (2 tables)
    Par JiB@ dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 28/02/2007, 16h31
  5. Requête : Insert avec plusieurs tables
    Par bleu_ciel dans le forum Access
    Réponses: 4
    Dernier message: 01/06/2006, 21h42

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