[Transact] Retour d'un BULK INSERT
Bonjour,
Je suis confronté à un problème dans ma procédure.
Voila, j'ai une procédure qui me permet de faire de l'insertion en block (BULK INSERT) dans une table qui à été au préalable vidée.
Cette table est un paramètre envoyé depuis un programme à ma procédure.
J'ai besoin que cette procédure me renvoi le nombre de ligne insérée.
Pour cela, après le BULK, j'effectue un SELECT COUNT sur la table mise à jour et je voudrais renvoyer le résultat en 'OUTPUT'.
Et donc mon problème arrive à ce stade, quand j'essaye de récupérer le résultat !
Voici ma procédure :
Code:
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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| CREATE PROCEDURE [DBO].[SP_IMPORTDATA]
@Table VARCHAR(128), -- nom de la table à mettre à jour
@Path VARCHAR(128), -- chemin du fichier d'input
@val INT OUTPUT
AS
DECLARE @Req VARCHAR(8000)
DECLARE @SQLString VARCHAR(800)
DECLARE @SQLCount VARCHAR(128)
BEGIN
-- Test lexistence des paramètres
IF @Table IS NULL or @Path IS NULL
BEGIN
RAISERROR ('SP_IMPORTDATA : Paramètres NULL impossible à traiter', 16, 1)
IF @@ERROR <> 0 GOTO LBL_ERROR1
IF @@ERROR = 547 GOTO LBL_ERROR2
END
-- Test l'existence de la table
IF NOT EXISTS(SELECT *
FROM INFORMATION_SCHEMA.tables
WHERE TABLE_NAME = @Table)
BEGIN
RAISERROR ('SP_IMPORTDATA : Références de table inconnue %s', 16, 1, @Table)
IF @@ERROR <> 0 GOTO LBL_ERROR1
IF @@ERROR = 547 GOTO LBL_ERROR2
END
-- Construction de la requête
SET @Req = 'BULK INSERT ' + @Table + ' FROM ''' + @Path + '\' + @Table + ''' WITH (FIELDTERMINATOR='';'', ROWTERMINATOR=''\n'', TABLOCK)'
--On passe en mode bulk-logged recovery model pour optimiser les performances
ALTER DATABASE AFER SET RECOVERY BULK_LOGGED
-- exécution de la requête pour l'insertion des données dans la table
EXEC (@Req)
--On passe en mode Full recovery model une fois l'insertion en block effectué
ALTER DATABASE AFER SET RECOVERY FULL
--Recuperation du nombre de ligne insérées et renvoi du nombre de lignes
SET @SQLCount = 'SELECT @val=count(*) FROM ' + @Table
EXEC(@SQLCount)
SELECT @val AS result
END
LBL_ERROR1:
PRINT 'ERREUR LORS DE L''EXÉCUTION DE LA PROCÉDURE STOCKÉE SP_ IMPORTDATA'
-- EXEC sp_update_notification 'Une erreur est survenu lors de l''execution de la procédure stockée SP_ IMPORTDATA', 'agent', 1
-- ROLLBACK TRANSACTION
LBL_ERROR2:
PRINT 'A CHECK CONSTRAINT violation occurred'
-- EXEC sp_update_notification 'Une erreur est survenu lors de l''execution de la procédure stockée SP_ IMPORTDATA', 'agent', 1
-- ROLLBACK TRANSACTION
GO |
L'erreur survient lors de l'execution de @SQLCount et de la variable @val (message : La variable '@val' doit être déclarée.)
j'ai vu, en faisant quelques recherche que la commande EXEC exécutait la requête dans un 'environnement différent' et donc l'erreur générée peut se comprendre mais je n'arrive pas à m'en sortir...
Ou alors, si vous avez une solution pour que le BULK INSERT fasse un retour des lignes qu'il a inséré...
Si vous aviez une idée, solution pour régler mon problème, ça serait formidable !
Merci