Bonjour,
je développe actuellement une application console ASP.NET dont le but est de charger un fichier texte dans une base SQL Server 2008.
Ces fichiers texte ne contiennent que des chaînes de caractères (délimitées par des " " donc) et des nombres.
Le problème est que la longueur des chaînes de caractères n'est pas fixe. Par exemple :
Je dois évidemment créer la table avant de pouvoir y insérer les données (la copie en elle-même se fait par SqlBulkCopy et ne pose aucun problème).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 "chaine1","chaine2",123,"chaine3" "machaine1","uneautrechaine2",87654,"ch3"
Sachant que :
- les fichiers comportent plusieurs centaines de milliers de lignes et des dizaines de colonnes
- plusieurs fichiers sont à insérer dans la même table (ce qui exclut la possibilité de parcourir le fichier une première fois pour déterminer la taille max des champs texte)
- j'ai un impératif à respecter en terme de performance, pas tant sur la création de la table et l'insertion de ces données (encore que, évidemment plus c'est rapide mieux c'est) mais surtout sur la lecture de la table par la suite.
Quelle est d'après vous la meilleure méthode pour créer la table et choisir un bon type de donnée pour les chaînes de caractères ?
Personnellement, je ne vois que deux solutions pour le moment, mais je ne m'y connais pas assez en SQL Server pour en trouver tous les avantages et inconvénients en terme de performance (et aussi de stockage, mais j'imagine que c'est assez lié).
1/ Dans le cas du premier fichier à insérer (donc la table doit être créée), parcourir le fichier en entier pour déterminer la valeur max de chaque champ texte et créer la table avec des VARCHAR(N) où N est donc cette valeur max calculée. Dans le cas de tous les autres fichiers à insérer dans la même table, calculer la taille max des champs texte à nouveau (je dois parcourir le fichier en entier de toute manière pour le mettre en mémoire dans une DataTable donc j'imagine que je peux le faire en même temps) et faire un ALTER TABLE pour augmenter la taille des VARCHAR quand nécessaire.
2/ Utiliser VARCHAR(MAX) pour chaque champ de texte.
Les champs de texte ne sont généralement pas très long (<200 chars) mais je n'ai aucun moyen de prédire l'avenir.
Pouvez-vous SVP me dire ce que vous pensez, notamment en terme de performance, de mes 2 solutions (la 1 me rebute un peu, la 2 me semble trop facile...) ? Et avez-vous d'autres idées ?
Merci !
Nicolas
Partager