Bonjour à tous
Je m'arrache les cheveux sur un problème que je n'arrive pas à comprendre.
Avant, j'avais un fichier UTF-16, Big Endian, avec le BOM correct (FE FF au début du fichier) qui s'intégrait parfaitement avec la commande BULK INSERT
1 2 3 4 5 6
| BULK INSERT [SYS_IMPORT]
FROM 'fichier-utf-16-be-BOM-OK'
WITH (FORMATFILE = 'SYS_IMPORT.fmt',
ROWS_PER_BATCH = 5000,
MAXERRORS = 5000,
CODEPAGE = 'ACP') |
Du jour au lendemain, alors qu'il n'y a pas eu de mise à jour de SQL Server, ni de Windows, elle ne foncionne plus, alors que ça fait 3 ans que la procédure fonctionnait nickel (bien qu'elle n'aurait pas dû... déjà rien que là je m'arrache les cheveux)
Aujourd'hui, mon BULK INSERT (qui est un peu mieux géré, entre temps j'ai lu la doc
) n'accepte que les fichiers UTF-16, Little Endian, et sans le BOM (sans le FF FE initial) sinon il le considère comme un caractère (et mon fichier est au format colonne fixes, donc sur la première ligne j'ai un caractère de trop)
(Pour info dans le nom du fichier "BE" ou "LE" signifie "Big Endian" ou "Little Endian")
1 2 3 4 5 6 7
| BULK INSERT SYS_IMPORT
FROM 'fichier-utf-16-le-BOM-NOK'
WITH ( FORMATFILE = 'le-meme-que-l-ancien',
ROWS_PER_BATCH = 5000,
MAXERRORS = 5000,
CODEPAGE = 'RAW',
DATAFILETYPE = 'widenative' ) |
Bon jusque là, je peux m'arranger, vu que c'est moi qui convertit via un programme home made le fichier reçu de notre client. Je l'ai donc paramétré pour qu'il me sorte un fichier sans BOM, UTF-16, Little Endian.
Bon bref, jusque là ça va. Or je dois extraire ce fichier via BCP pour le réintégrer dans une autre table. J'exécute donc la commande suivante :
bcp "SELECT LEFT(DONNES, 600) FROM MA_BASE.dbo.SYS_IMPORT where CODE_INTERFACE = 1" queryout "TBL_AFFAIRE.txt" -w -T -C"RAW" -SSERVEUR
Et là c'est le drame. J'obtiens un fichier au format UTF-16, Little Endian, avec le BOM... et du coup quand je fais mon BULK INSERT, le BOM fais un caractère de plus, la première ligne fais 1 caractère de trop, l'import échoue, et je suis bloqué pour la suite.
J'ai essayé les différents formats de fichiers (options -c -n -w -6)
-c ne me convient pas, j'ai besoin de gérer des fichiers internationnaux, entre autres russe, grecs et turcs qui sont dans des jeux de caractères différents, d'où l'utilisation de l'unicode
-n ne s'importe pas avec ma commande BULK INSERT comme au dessus (il y a peut être quelque chose que j'ai oublié de modifier, mais j'ai pas trouvé)
-6 n'a pas d'intérêt, vu que je pars d'une base de données 2K5 et que j'arrive dans une base de données 2K5
-w me met le BOM FF FE en début de fichier
Je cherche donc l'une des solutions suivante :
- Arriver à intégrer un fichier via un BULK INSERT avec SQL Server qui prends en compte mon BOM (et qu'il gère le Big Endian serait un gros plus, j'aurais pas besoin de refaire X configurations sur le serveur de prod)
- faire que BCP me sorte un fichier en UTF-16, Little Endian, sans BOM
Dans les 2 cas, après je vais pouvoir recommencer l'import de mon fichier comme il faut. Et je verrai plus tard pour faire un truc plus propre qui n'a pas besoin de faire des imports=>extraction=>réimport pour importer mon fichier de données. Pour le moment, il est plus urgent pour moi de refaire fonctionner l'existant, l'optimisation sera pour plus tard.
Partager