Bonjour,
Contexte :
Je dois migrer une base de données de SQLServer 2008 vers 2019. Il y a des programme en taches planifiées qui mettent à jours des référentiels dans la base à partir de fichiers CSV. Ces programmes ont été écrite en C# avec spring et NHibernate et ont passé du framework 4.6.2 vers 4.8.1. Serveurs US. Et bien sur, ça fonctionnait avant.
Contraintes :
De temps, d'argent, de personnel, comme d'hab, mais en pire pour certaines raisons.
Problème :
La mise à jours des référentiels plante sur les DateTime avec des fonction d'import de masse.
Il y a des requêtes type
INSERT INTO IMP_XXX SELECT * FROM OPENROWSET(BULK 'D:\Applications\Dev\YYYY\Fichiers_recus\REF_XXX_20230420_043354.CSV', FORMATFILE = 'D:\Applications\Dev\YYYY\Import_Chene\BcpFormat\IMP_XXX.xml')
.
Le format Dates dans les fichiers CSV est JJ/MM/AA.
Les fichiers BCP ressemblent à ça
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <?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="2" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="50" COLLATION="French_CI_AS"/>
<FIELD ID="3" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="50" COLLATION="French_CI_AS"/>
<FIELD ID="4" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="50" COLLATION="French_CI_AS"/>
<FIELD ID="5" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="50" COLLATION="French_CI_AS"/>
<FIELD ID="6" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="100" COLLATION="French_CI_AS"/>
<FIELD ID="7" xsi:type="CharTerm" TERMINATOR="\r\n" MAX_LENGTH="50" COLLATION="French_CI_AS"/>
</RECORD>
<ROW>
<COLUMN SOURCE="2" NAME="BU_GL" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="3" NAME="CODE" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="4" NAME="DATE_EFFET" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="5" NAME="STATUT" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="6" NAME="DESCRIPTION" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="7" NAME="DESCRIPTION_COURTE" xsi:type="SQLNVARCHAR"/>
</ROW>
</BCPFORMAT> |
L'erreur est
System.Data.SqlClient.SqlException (0x80131904): The conversion of a nvarchar data type to a datetime data type resulted in an out-of-range value.
J'ai vérifié/changé les paramètres régionaux de Windows (Français, format date, etc), Le langage par defaut, la langue de collation de SQL Server plus teste pas mal de choses glanées sur Internet, j'ai toujours cette erreur. Le format date pour toutes les session est DMY.
Si je change le type de SQLNVCHAR vers SQLDATE dans les fichier BCP, j'ai les erreurs suivantes dés que le jour est supérieur à 12 :
Bulk load data conversion error (type mismatch or invalid character for the specified codepage).
Y'a t-il une solution rapide ?
Cordialement,
Hervé.
Partager