Bonjour,

Je rencontre un problème dans l'import d'un fichier à plat sur une base SQL Server 2008.
Mon fichier .txt comprend des données PRIX (colonne TARIF) de format float.
Le problème est que mon fichier (dont je n'ai pas la possibilité de modifier les données) traduit les prix à virgule avec le symbole , et non .
Ce fichier contient également une colonne LPPTXT qui contient des virgules (ne doivent pas être converties).
Mon but serait de pouvoir convertir la virgule en point avant l'insertion dans ma table.
Une solution serait de convertir ma colonne TARIF de float vers varchar pour convertir la virgule en point après le chargement pour réutiliser ces données.
Ce procédé fonctionne mais cela me gène de devoir modifier le type de la colonne TARIF.

Ci-dessous se trouve les différents fichiers utilisés pour mon chargement.
(ces fichiers fonctionnent puisqu'en supprimant la colonne TARIF des différents fichiers, l'import se fait correctement)

- fichier mon_fichier.txt
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1100034|20060308|21111111|12,86||DESCRIPTION POSSEDANT DES , A, B, C|1|1|7|4|0|0|http://www.siteweb.fr/|||
La donnée TARIF (float) est 12,86

- fichier bcpMA_TABLE.sql
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
TRUNCATE TABLE MA_TABLE;
BULK INSERT MA_TABLE
FROM 'C:\mon_fichier.txt'
WITH (
CODEPAGE='RAW',
FORMATFILE='C:\formatMA_TABLE.xml'
);
GO
- fichier formatMA_TABLE.xml
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
22
23
24
25
26
27
28
29
30
31
32
33
34
<?xml version="1.0"?>
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<RECORD>
<FIELD ID="1" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="7"/>
<FIELD ID="2" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="8"/>
<FIELD ID="3" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="8"/>
<FIELD ID="4" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="8"/>
<FIELD ID="5" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="1"/>
<FIELD ID="6" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="255" COLLATION="French_CI_AS"/>
<FIELD ID="7" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="4"/>
<FIELD ID="8" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="4"/>
<FIELD ID="9" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="4"/>
<FIELD ID="10" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="4"/>
<FIELD ID="11" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="4"/>
<FIELD ID="12" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="4"/>
<FIELD ID="13" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="255" COLLATION="French_CI_AS"/>
<FIELD ID="14" xsi:type="CharTerm" TERMINATOR="\r\n" MAX_LENGTH="100"/>
</RECORD>
<ROW>
<COLUMN SOURCE="1" NAME="LPPCOD" xsi:type="SQLCHAR"/>
<COLUMN SOURCE="2" NAME="DEBDAT" xsi:type="SQLDATETIM8"/>
<COLUMN SOURCE="3" NAME="FINDAT" xsi:type="SQLDATETIM8"/>
<COLUMN SOURCE="4" NAME="TARIF" xsi:type="SQLFLT8"/>
<COLUMN SOURCE="5" NAME="ANNEXE" xsi:type="SQLCHAR"/>
<COLUMN SOURCE="6" NAME="LPPTXT" xsi:type="SQLCHAR"/>
<COLUMN SOURCE="7" NAME="COD1" xsi:type="SQLINT"/>
<COLUMN SOURCE="8" NAME="COD2" xsi:type="SQLINT"/>
<COLUMN SOURCE="9" NAME="COD3" xsi:type="SQLINT"/>
<COLUMN SOURCE="10" NAME="COD4" xsi:type="SQLINT"/>
<COLUMN SOURCE="11" NAME="COD5" xsi:type="SQLINT"/>
<COLUMN SOURCE="12" NAME="COD6" xsi:type="SQLINT"/>
<COLUMN SOURCE="13" NAME="WEB" xsi:type="SQLCHAR"/>
</ROW>
</BCPFORMAT>
En passant la commande suivante sous dos:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
sqlcmd -U "utilisateur" -P "Mot de pase" -S "instance" -d "BDD" -i "bcpMA_TABLE.sql" -W -o "C:\logMA_TABLE.txt" -p 1
Résultat du fichier logMA_TABLE.txt
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
Message 4864, niveau 16, état 1, serveur MON_SERVEUR\SQLEXPRESS, ligne 2
Erreur de conversion des données à charger en masse (incompatibilité de type ou caractère non valide pour la page de codes spécifiée) pour la ligne 1, colonne 4 (TARIF).
Ayant également une base Oracle 10 pour réaliser ce même import via SQL Loader, Oracle permet de modifier les données avant insertion ce qui m'a permis de conserver le type float de la colonne TARIF.
Je cherche donc une fonction similaire permettant de modifier les données avant insertion dans ma table.

Quelqu'un aurait-il une solution pour conserver mon format de colonne float et charger mes prix avec le symbole point au lieu de virgule?

D'avance merci.