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

MS SQL Server Discussion :

Insert massif et identity


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    480
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 480
    Par défaut Insert massif et identity
    Bonjour

    J'aimerai faire la requête suivante :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO T1 (id, champ1)
    SELECT MAX(T1.id)+1, T2.champ1
    FROM T2

    Je ne sais pas si ma requête est bien claire?

    Il y aurai-t-il une solution?

    Merci d'avance

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 135
    Par défaut
    Je pense que tu devrais passer par un curseur ou faire ceci par code.

    A+

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 998
    Billets dans le blog
    6
    Par défaut
    Ceci est la pire des bêtises...
    1) il existe un auto incrément dans SQL Server (propriété IDENTITY)
    Lisez ce que j'ai écrit à ce sujet : http://blog.developpez.com/sqlpro/p6...ec-sql-server/
    2) il existe aussi une fonction IDENTTY() pour faire un SELECT ... INTO
    3) le SELECT MAX() + 1 ne vous donnera qu'une seule valeur en non n valeurs pour chaque ligne. SQL Est un langage ensembliste et non, ligne à ligne
    4) dans le pire des cas, utilisez la fonction ROW_NUMBER() disponible à partir de la V 2005.

    A lire sur l'auto incrémentation : http://sqlpro.developpez.com/cours/clefs/

    En complément, incrémentation massive de plusieurs lignes :
    http://blog.developpez.com/sqlpro/p6...nes-a-increma/

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    480
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 480
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    3) le SELECT MAX() + 1 ne vous donnera qu'une seule valeur en non n valeurs pour chaque ligne. SQL Est un langage ensembliste et non, ligne à ligne
    Oui je sais... c'est bien pour cela que je demande, je sais bien que la requête que j'ai ecrit est :
    1 - Complètement fausse
    2 - irréalisable avec un MAX

    Citation Envoyé par SQLpro Voir le message
    4) dans le pire des cas, utilisez la fonction ROW_NUMBER() disponible à partir de la V 2005.
    J'ai essayé... perf catastrohpique... j'essaye de traiter en une requête plusieurs milliers d'enregistrements

    Je pense que votre article sur IDENTITY est la bonne réponse à mon problème... mais je n'ai pas réussi à trouver une doc correcte à ce sujet sur MSDN.

    Je pense que votre article va bien m'aider

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    480
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 480
    Par défaut
    En fait je retire ce que j'ai dit... je croyais que l'on pouvait spécifier une colonne en IDENTITY temporairement, mais d'après votre article on peut juste désactiver la propriété IDENTITY sur une table... donc IDENTITY ne peut pas résoudre mon problème

    Mais il n'y a pas trop de difficulté à faire cela... ce que j'essaye de faire et bien.. c'est tout le contraire!

    Bien entendu je ne peux pas passer ma colonne on IDENTITY (par exemple parceque différents sites WEB gère cet ID en session... mauvais choix technique, mais bon, j'ai pas le choix il faut que je fasse avec)

    Est-ce possible de spécifier une colonne de type int en IDENTITY après la définition de la table?



    PS: autant je suis plutôt un pro SqlServer, autant je regrette ce bon vieux ROWNUM ORACLE qui m'aurait éviter bien des soucis!

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 998
    Billets dans le blog
    6
    Par défaut
    Est-ce possible de spécifier une colonne de type int en IDENTITY après la définition de la table?
    Le seule moyen est de supprimer et recréer la colonne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    autant je regrette ce bon vieux ROWNUM ORACLE qui m'aurait éviter bien des soucis!
    mais il en pose d'autres...

    Quel est votre problème au niveau fonctionnel ?

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. [PROC] Optimisation d'insert massif en "Bulk Load"
    Par Jacker0r dans le forum SAS Base
    Réponses: 19
    Dernier message: 24/03/2011, 22h34
  2. SQL 2k5 - Bulk Insert et contrainte identity
    Par Luc1an0 dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 08/01/2008, 19h35
  3. Insertion impossible car identity insert défini à off
    Par dubidon dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 05/06/2007, 15h34
  4. Insert massif
    Par jexl dans le forum Requêtes
    Réponses: 5
    Dernier message: 11/10/2005, 16h15
  5. [FB] Insert massif et lenteur...
    Par Benjamin GAGNEUX dans le forum Débuter
    Réponses: 26
    Dernier message: 02/08/2005, 15h25

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