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 :

Problem avec le BULK INSERT


Sujet :

MS SQL Server

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2005
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 29
    Points : 24
    Points
    24
    Par défaut [Résolu]Problem avec le BULK INSERT
    Bonjour,
    j'ai un problème avec le bulk insert qui pmarche a merveille lorsque j'indisque le chemin du fichier,
    mais dès que j'essaie de gérer ceci en variable ça plante !!!

    quelqu'un connait la syntaxe correcte, merci D4AVANCE

    Voici le code de ma procedure stockée

    ALTER PROCEDURE HA_MAJ_REXEL


    @CSV_PATH VARCHAR(200)

    AS

    IF EXISTS (SELECT name FROM sysobjects WHERE name = '#TmpStList')
    DROP TABLE #TmpStList
    IF EXISTS (SELECT name FROM sysobjects WHERE name = 'StudentList')
    DROP TABLE StudentList


    CREATE TABLE dbo.StudentList
    ( FName int,
    LName int )

    CREATE TABLE TmpStList
    ( stFName int, stLName int
    )


    /* partie ou j'indique le chemin
    --BULK INSERT #TmpStList FROM 'E:\Fichier_test.csv' WITH (FIELDTERMINATOR = ';')


    /* ici ça ne marche pas j'ai tester avec '@mavariable', compilation ça marche mais execution non idem lorsque je mets "" */
    BULK INSERT #TmpStList FROM @CSV_PATH WITH (FIELDTERMINATOR = ';')

    --print 'le chemin = '+ CONVERT(VARCHAR(100),@CSV_PATH)

    INSERT StudentList (FName,LName)
    SELECT stFName, stLName + stLName
    FROM #TmpStList


    DROP TABLE #TmpStList



    GO
    SET QUOTED_IDENTIFIER OFF
    GO
    SET ANSI_NULLS ON
    GO

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 902
    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 902
    Points : 53 143
    Points
    53 143
    Billets dans le blog
    6
    Par défaut
    Il faut faire cela avec du SQL dynamique.

    A +

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2005
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 29
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Il faut faire cela avec du SQL dynamique.

    A +
    salut,
    Excuse moi,mais je ne comprend pas ce que tu veux me dire par là

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 356
    Points : 406
    Points
    406
    Par défaut
    La requête dynamique est une chaine de caractère exécutée.

    EXEMPLE :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    DECLARE @query VARCHAR(1000)
    DECLARE @maTable VARCHAR(50)
     
    SET @maTable='ETUDIANT'
    SET @query='SELECT * FROM '+@maTable
     
    EXECUTE(@query)
    Dans cet exemple j'exécute une requête de sélection avec une table passée en variable.

  5. #5
    Membre à l'essai
    Inscrit en
    Juillet 2005
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 29
    Points : 24
    Points
    24
    Par défaut
    [QUOTE=Madinico;2549872]La requête dynamique est une chaine de caractère exécutée.

    EXEMPLE :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    DECLARE @query VARCHAR(1000)
    DECLARE @maTable VARCHAR(50)
     
    SET @maTable='ETUDIANT'
    SET @query='SELECT * FROM '+@maTable
     
    EXECUTE(@query)
    merci ça ma vachement aider


    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
    DECLARE @SQL varchar(2000)
     
     
    CREATE TABLE TmpStList
    ( FABRICANTS	varchar(200),
      CF 	varchar(200),
      G	varchar(200),
      Libellé_GammeREXEL	varchar(2000),
      SG	varchar(50),
      Libelle_Sous_GammeREXEL	varchar(200),
      Remise_contrat	real,
      Condition_derogee	varchar(200),
      Commentaire  	varchar(2000)
    )
     
    set @SQL = 'BULK INSERT TmpStList FROM '''+@CSV_PATH+''' WITH (FIELDTERMINATOR = '';'')'
     
    exec (@SQL)
     
    DELETE FROM  TmpStList WHERE (CF IS NULL) AND (G IS NULL) 
    select * from TmpStList
    elle marche bien sauf, je ne sais pas bcp ça plante des que je lui file un fichier en réseaux, avec une appli que j'ai fait en VB

    sinon comment faitons si je ne connais pas le nombre de colonne du fichiers cvs, c a d pour généraliser le bulk insert de ma requete?

    merci

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 356
    Points : 406
    Points
    406
    Par défaut
    Il est normal que ça plante car les instructions T-SQL ne sont pas faites pour sortir de l'environnement du serveur SQL sur lequel elle s'exécute.

    Pour ton second problème, je te conseillerai d'utiliser le fichier de format.

  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
    Citation Envoyé par Soulkeum

    elle marche bien sauf, je ne sais pas bcp ça plante des que je lui file un fichier en réseaux, avec une appli que j'ai fait en VB
    Normal car SQL Serveur ne gère pas les chemins UNC.
    C'est contre les performances.Mais essai d'abord avec les lecteurs réseaux.

  8. #8
    Membre à l'essai
    Inscrit en
    Juillet 2005
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 29
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par WOLO Laurent Voir le message
    Normal car SQL Serveur ne gère pas les chemins UNC.
    C'est contre les performances.Mais essai d'abord avec les lecteurs réseaux.
    Bonjour,
    peux-tu me dire comment on gere les lecteur ?

    ce qui étrange et que dans mon boulot, il y a beaucoup d'application qui fonctionne avec le principe de application sur un serveur, et base sql sur un autre autre serveur.

    merci

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 056
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 056
    Points : 1 216
    Points
    1 216
    Par défaut
    bonjour,

    La commande bulk insert supporte les fichiers avec chemin UNC (dans le style

    \\machine\c$\bcp\fichier.bcp)

    En fait, pour comprendre ton problème, il faudrait poster le message d'erreur renvoyé par ta commande.

    Il arrive souvent que ce soit lié à un problème de droits, le SQLServer exécutant le bulk insert n'ayant pas le droit de lire le fichier sur le serveur distant.

  10. #10
    Membre à l'essai
    Inscrit en
    Juillet 2005
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 29
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par kagemaru Voir le message
    bonjour,

    La commande bulk insert supporte les fichiers avec chemin UNC (dans le style

    \\machine\c$\bcp\fichier.bcp)

    En fait, pour comprendre ton problème, il faudrait poster le message d'erreur renvoyé par ta commande.

    Il arrive souvent que ce soit lié à un problème de droits, le SQLServer exécutant le bulk insert n'ayant pas le droit de lire le fichier sur le serveur distant.
    Bonjour,
    Merci Exactement le probleme vient d'un partage et de problem de droit j'ai maintenant comme j'ai besoin de généraliser mon appli a n'importe quel fichier,
    je en sais pas pk ça plante quen je mets #table.

    Quelqu'un sais comment faire ?

    message d'erreur !!
    Bulk insert data conversion error (type mismatch) for row 24, column 7 (contact).

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 056
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 056
    Points : 1 216
    Points
    1 216
    Par défaut
    Bulk insert data conversion error (type mismatch) for row 24, column 7 (contact) :

    cela signifie que les droits sont ok mais que le format du fichier par rapport à la table est incorrect.

    Donc, quel est votre format de fichier (colonnes séparées par les ; des tab, etc.)
    et quel est votre format de table destination ?

  12. #12
    Membre à l'essai
    Inscrit en
    Juillet 2005
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 29
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par kagemaru Voir le message
    cela signifie que les droits sont ok mais que le format du fichier par rapport à la table est incorrect.

    Donc, quel est votre format de fichier (colonnes séparées par les ; des tab, etc.)
    et quel est votre format de table destination ?
    Mon fichier c'est un CSV donc des ";" pour les separations, je veux l'importer dans une table que j'ai créer

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 356
    Points : 406
    Points
    406
    Par défaut
    TOn problème de format vient du contenu des données que tu souhaites insérer dans tes colonnes.

    Exemple
    ch1 type int
    ch1=abcde

    Un erreur de conversion se produit. Il faut vérifier les cohérences entre le type des colonnes de ta table et les données que tu souhaites y insérer.

  14. #14
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 056
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 056
    Points : 1 216
    Points
    1 216
    Par défaut
    il faudrait nous poser la structure de votre table et la 24eme ligne du fichier concerné.

  15. #15
    Membre à l'essai
    Inscrit en
    Juillet 2005
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 29
    Points : 24
    Points
    24
    Par défaut
    Bonjour,

    Vu le nombre incroyable d'erreurs ! et comme je savais que je devais généraliser mon appli

    j'ai commencé par parsser (formater) le fichier XLS avec une macro, j'ai garder que ce que dont j'ai besoin.
    ce qui me fais 6 colonnes au lieu de 32
    le bulkinsert marche a merveille !!!
    sauf un pb, en fait dans le fichier xls il mette la virgule au lieu du point pour les chiffres réel.
    lorsque j'ai déclaré dans ma table la colonne en float (45,5 devennai 455.0)lorsque je déclare en vachar ça marche mais j'ai toujours le , au lieu du point, comment y remmedier ?.

    j'ai résolu le problem grace à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    update TmpStList set Remise_REXEL = replace (Remise_REXEL,',','.')
    je mets en résolu

    merci

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

Discussions similaires

  1. Probleme avec update or insert
    Par devalender dans le forum SQL
    Réponses: 3
    Dernier message: 24/04/2013, 13h47
  2. SQL Server 2005 :probleme avec truncate et insert
    Par blaise4714 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 20/03/2009, 16h11
  3. [SQL2005-8] Probleme de charset avec BULK INSERT
    Par rom92150 dans le forum MS SQL Server
    Réponses: 0
    Dernier message: 26/11/2008, 17h29
  4. probleme avec la méthode insert de std::set
    Par elekis dans le forum SL & STL
    Réponses: 4
    Dernier message: 18/04/2007, 18h01
  5. Probleme avec UPDATE et INSERT INTO
    Par cmoimeme dans le forum Bases de données
    Réponses: 3
    Dernier message: 08/05/2006, 22h12

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