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 : 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
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 l’existence 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