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 :

SQL 2k5 - Bulk Insert et contrainte identity


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2007
    Messages : 467
    Par défaut SQL 2k5 - Bulk Insert et contrainte identity
    Bonjour à toutes et tous,
    tout d'abord bonne année et meilleurs voeux à tous !

    Je suis confronté à un souci assez délicat. Je suis dans la refonte d'une application de access vers ASP.NET/SQL 2k5.

    Je dois migrer les données d'une base à l'autre mais les clé primaires de la base access ne sont pas toujours incrementé de 1. Je peux alors me retrouver avec un id 6 suivi d'un id 8.

    Pour la migration j'ai utilisé l'export csv d'access puis la commande Bulk insert.

    Pour ne pas gérer les id depuis mon code, j'utilise la contrainte d'identité de SQL. Mais du coup, SQL me recalcule mes id... Ceci est embettant car du coup les associations de clé etrangere ne valent plus rien :s


    J'ai d'abord pensé à créer mes tables sans contrainte d'identité et les rajouter après, mais ceci n'est pas possible en script (d'après ce que j'ai pu lire dans un forum). Ou bien si, mais il faut passer par une table temporaire, et au final le résultat sera le meme, au moment du bulk insert il me remettra de nouveaux id recalculé.

    J'ai ensuite pensé à faire un SET IDENTITY_INSERT maTable OFF avant mon bulk insert, en espérant que le moteur insèrera les données avec les bons anciens id, mais non, les id ont bel et bien changé et je me retrouve avec un 7 au lieu de mon 8 (qui était le dernier id de la table).


    J'ai quelques tables quand meme donc le faire à la main... bof ....Si y a vraiment pas d'autres solutions ok, mais ça m'arrangera pas

    A celui, celle, ceux qui auront de brillantes idées : d'avance, Merci !

  2. #2
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2007
    Messages : 467
    Par défaut
    Bon et bien mes recherches sont allées très vite en fin de compte

    En faisant un test un peu plus basique, i.e. j'enlève la contrainte d'identite et je fais mon bulk insert, je me suis aperçu que mes id etaient encore et toujours incrementé de 1, donc mon saut de 6 à 8 n'existant plus.

    J'ai donc conclu que c'était la clé primaire qui mettait le souk.

    J'ai donc crée ma table avec la contrainte d'identité mais sans clé primaire, définit l'IDENTITY_INSERT a OFF, effectué mon bulk insert, et finit par ajouter ma clé primaire avec un alter table.

    EDit : j'ai parlé trop vite... Je n'avais pas essayé un insert manuel derriere...
    Lors de l'insert il m'a remplacé ma clé 8 par 7, et mis ma nouvelle clé a 8...

    Est ce que le fait d'avoir une association de clé etrangere sur cette clé primaire peut empecher cette modification ?

  3. #3
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2007
    Messages : 467
    Par défaut
    Il semblerait que je me suis trompé sur le message d'avant, mais il faut de toute evidence que j'enleve : clé primaire et contrainte d'identité...et que je fasse mes bulk insert avant de les définir...

    A moins que quelqu'un ait une solution pour moi, ça sent la méthode " a la mano"...

    C'est dur pour un développeur.....

    Pour éviter de pourrir le post, et vu que j'ai fais la buze de seconde zone (j'apprendrai à chercher dans la msdn la prochaine fois :s), j'aimerai demander un peu d'aider pour cette article :
    http://msdn2.microsoft.com/fr-fr/library/ms174123.aspx

    normallement ça devrait etre :
    ALTER TABLE MaTable
    Alter column MonChamps IDENTITY(1,1)
    GO

    Mais j'obtiens ça !

    Msg 102, Niveau 15, État 1, Ligne 1
    Syntaxe incorrecte vers 'MonChamps'.

  4. #4
    Membre Expert
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Par défaut
    Bonjour,


    Citation Envoyé par Luc1an0 Voir le message
    J'ai ensuite pensé à faire un SET IDENTITY_INSERT maTable OFF avant mon bulk insert, en espérant que le moteur insèrera les données avec les bons anciens id, mais non, les id ont bel et bien changé et je me retrouve avec un 7 au lieu de mon 8 (qui était le dernier id de la table).
    Tu dois mettre le SET IDENTITY INSERT tatable ON, et non pas OFF, pour permettre une insertion explicite de ta clé primaire.

    Tu ne peux pas faire un ALTER de colonne pour ajouter ou enlever la propriété identity, ce n'est pas supporté.

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 999
    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 999
    Billets dans le blog
    6
    Par défaut
    faites votre bulk inset avec l'option KEEPIDENTITY

    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/ * * * * *

  6. #6
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2007
    Messages : 467
    Par défaut
    Merci !!!

    C'était bien l'option KEEPIDENTITY qu'il fallait rajouter !

    Merci beaucoup !

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

Discussions similaires

  1. [2K5] BULK INSERT / BCP / Unicode / BOM / UTF-16
    Par mioux dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 20/11/2009, 15h11
  2. Réponses: 1
    Dernier message: 23/02/2009, 13h31
  3. [SQL Server 2005] BULK INSERT sans effet
    Par mout1234 dans le forum Développement
    Réponses: 5
    Dernier message: 11/02/2009, 09h39
  4. [SQL SVR 2K]Bulk Insert-Je ne peux pas ouvrir le fichier
    Par Franck2mars dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 11/07/2006, 14h12
  5. DBI et BULK INSERT sur SQL Server
    Par elvivo dans le forum SGBD
    Réponses: 4
    Dernier message: 25/04/2006, 23h47

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