Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SQL Server]Traiter les erreurs dans bulk insert

    8 avril 2024 à 11:15:47

    Bonjour, 

    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).

    Merci pour votre aide!

    • Partager sur Facebook
    • Partager sur Twitter
      10 avril 2024 à 14:40:59

      ERROR_MESSAGE() ne renvoie pas d'informations exploitables ?
      • Partager sur Facebook
      • Partager sur Twitter

      [SQL Server]Traiter les erreurs dans bulk insert

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      • Editeur
      • Markdown