Je suis entrain d'ajouter une nouvelle fonctionnalité à mon site web asp.net, le but est de upload un fichier csv et que celui-ci soit traité par une procédure stockée SQL server. Pour effectuer le bulk insert j'utilise cette commande dans ma procédure :
SET @SQLBulk = '
BEGIN TRANSACTION
BULK INSERT '+ @Prod_Table +
' FROM ''' + @CSVFilePath + '''
WITH
(
ERRORFILE = '''+ @ErrorFile +''',
CHECK_CONSTRAINTS,
FIELDTERMINATOR = '';'',
ROWTERMINATOR = ''\n'',
FIRSTROW = 2,
FORMAT = ''CSV'',
MAXERRORS = 10
)
COMMIT TRANSACTION'
-- Exécuter la requête dynamique
BEGIN TRY
PRINT CAST(@SQLBulk as ntext)
EXEC sp_executesql @SQLBulk
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
IF ERROR_NUMBER() IN (100, 7330)-- Erreur de syntaxe
BEGIN
SET @ErrorMessage = 'ERREUR:: Le fichier est mal formaté, il ne contient pas le bon nombre de champs et/ou Mauvais type de données'
END
IF ERROR_NUMBER() IN (547) -- Violation de contrainte d'intégrité référentielle
BEGIN
SET @ErrorMessage = 'ERREUR:: ...'
END
IF ERROR_NUMBER() IN (515) -- Violation de contrainte de clé étrangère
BEGIN
SET @ErrorMessage = 'ERREUR:: ...'
END
IF ERROR_NUMBER() IN (2627, 2601) -- Violation de contrainte d'unicité
BEGIN
SET @ErrorMessage = 'ERREUR::...'
END
RAISERROR (@ErrorMessage, 15, 1)
END CATCH
END
Maintenant je veux logger les erreurs liées au contraintes (unique, foreing key etc...), j'ai vu que l'option ERRORFILE me permet de stocker les erreurs dans des fichiers de logs, mais malheureusement cela ne concerne que les erreurs liés au fichier lui même (mauvais type de données etc...) et non à l'intégrité de données. Concrètement mon problème est le suivant, quand on catch une erreur, avec bulk insert je n'ai aucun moyen de connaitre la ligne qui a suscité l'erreur, et que à partir du moment qu'il y a un seule mauvaise entrée, toute est bloqué par la suite, ce qui veut dire que si mon fichier contient 1000 entrée dont 50 fausses, il faut re upload le fichier au moins 50 fois pour pouvoir tout insérer. Ce que je veux c'est de passer sur tout le fichier, insérer la totalité si pas d'erreur, et s'il y a des erreur, les logger (dans une table ou dans un fichier peu importe).