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 :

Insert depuis des csv sans bulkcopy


Sujet :

Développement SQL Server

  1. #1
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 218
    Points : 28 193
    Points
    28 193
    Par défaut Insert depuis des csv sans bulkcopy
    Salut à tous,

    D'abords plantons le décor : SQLServeur 2008 R2, un petit utilitaire qui prépare des bases client. Dans le processus de préparation, il y a une phase d'import d'une 50ène de fichiers plats disons csv pour faire simple (c'est pas du "vrai" csv, mais c'est le même principe).
    Les fichiers se trouveront normalement dans un dossier du serveur SQLServer. C'est pas une obligation à l'heure actuelle, mais une forte recommandation, ça pourra le devenir si c'est nécessaire. La seule obligation est que les fichiers soient accessibles sur le réseau par le moteur SQL.

    L'utilitaire est utilisé en local sur le poste des utilisateurs, plusieurs utilisateurs simultanément. L'utilitaire est développé en .Net et actuellement l'import des fichiers est réalisé par la méthode .Net SQLBulkCopy.
    Sur le réseau local tout marche bien

    Maintenant, le problème :
    Bientôt, 10% environ des utilisateurs, peut-être plus à terme, seront localisés sur un site distant, connexion au siège via internet et vpn (je suis moi-même sur ce site distant)
    Avec cette méthode de SqlBulkCopy, les temps d'intégration des dits-fichiers se trouve multiplié pas 15 à 20, ce qui n'est pas acceptable.
    Avec une analyse rapide, j'ai l'impression que via SqlBulkcopy, chaque fichier est d'abords rapatrié en local sur la machine du site distant avant d'être renvoyé sous forme de requête (je pense) au serveur SQL.
    il faudrait donc que je vire le SqlBulkCopy et que je le remplace par autre chose
    A noter que pour le reste des traitements, même faisant intervenir SqlServer, il n'est pas relevé de différences notables entre une utilisation sur le réseau local ou depuis le site distant

    Ce que je cherche :
    Il me semble me rappeler avoir déjà effectuer ce genre d'insert à distance, il y a une bonne 10ènes d'années directement via une requête SQL, fichiers sur le serveur SQL distant, requête exécutée à distance via SSMS, le moteur se démerdait à récupérer les fichiers localement chez lui.
    Mais je ne retrouve pas la syntaxe.

    Rappel : fichiers présents sur le serveur SQL ou tout au moins accessible localement sur le réseau, fichier au format similaire au csv (délimiteur différent, ligne d’entête), les fichiers ne contiennent généralement pas toutes les colonnes de leur table correspondante (absence de la clé primaire notamment, auto-générée à l'insertion). On a déjà un fichier schéma pour l'ensemble des fichiers au format ini, compatible MS Jet 4.5
    Commande envoyée depuis un exe lancé sur un poste d'un site distant

  2. #2
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Si le fichier est localement présent sur le server sql, sqlbulkcopy rapatrie localement les données, je vous le confirme puisque vous pouvez utiliser sqlbulkcopy avec n'importe quelle source (même un simple objet en mémoire).

    Le plus simple: créez une procédure stockée prenant en paramètre le chemin du fichier a importer et appelez la directement de votre code...

    A l'intérieur de la procédure stockée utilisez le BULK INSERT en TSQL (https://docs.microsoft.com/fr-fr/sql...t-transact-sql)

    Dans les grandes lignes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    BULK INSERT AdventureWorks2012.Sales.SalesOrderDetail  
       FROM 'f:\orders\lineitem.tbl'  
       WITH   
          (  
             FIELDTERMINATOR =' |',  
             ROWTERMINATOR =' |\n'  
          );

  3. #3
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 218
    Points : 28 193
    Points
    28 193
    Par défaut
    salut,

    Effectivement ce matin je suis parti sur cette piste, mais je rencontre, pour le moment, principalement, 2 problèmes.

    1 - JE suis obligé de passer par un fichier schéma car mon fichier texte ne contient pas toutes les colonnes de la table, mais j'ai, malgré tout un décalage, la première colonne du fichier ne correspond pas à la première colonne de la table

    2 - J'ai un problème avec les dates. Mes dates sont au format français, ça j'ai réglé avec set dateformat dmy, mais surtout les champs correspondant aux dates dans le fichier texte peuvent être vide. Cela me génère une erreur de conversion lors du bulkinsert malgré le fait d'avoir indiqué que les champs peuvent être null des 2 cotés dans le schéma, et de faire le bulk avec l'option KEEPNULLS

  4. #4
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Dans ce cas j'ai plus simple: placez le code actuel sqlbulkcopy dans un web service héberge sur le même réseau que votre Server sql...

    Côté client lourd appelez simplement le WS...

Discussions similaires

  1. [AC-2003] Creation automatique de table depuis des fichiers CSV
    Par basto dans le forum VBA Access
    Réponses: 2
    Dernier message: 21/09/2011, 16h29
  2. [XL-2007] exporter depuis .xlsm vers .csv sans convertir "001" en 1
    Par EmmanuelleC dans le forum Excel
    Réponses: 4
    Dernier message: 12/04/2010, 09h13
  3. Script avec gestion d'erreur pour loader des data depuis un csv
    Par olive_le_malin dans le forum Requêtes
    Réponses: 9
    Dernier message: 10/04/2009, 18h04
  4. [SQL2K] Select/Insert depuis des bases différentes
    Par Kloun dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 23/10/2007, 14h58
  5. [MySQL] Importer des valeurs "date" depuis fichier csv
    Par all42 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 27/05/2007, 10h23

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