IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

[Transact] Retour d'un BULK INSERT


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 13
    Par défaut [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 : 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

  2. #2
    Membre averti
    Inscrit en
    Février 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 13
    Par défaut
    Re-bonjour,

    Bon, problème résolu !
    j'ai utilisé la procédure sp_executeSQL pour effectuer mon select
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    --Recuperation du nombre de ligne insérées et renvoi du nombre de lignes
    	DECLARE @ParmOutput NVARCHAR(50)
    	SET @SQLCount = 'SELECT @val=count(*) FROM ' + @Table
    	SET @ParmOutput = N'@val int output' 
     
    	EXECUTE sp_executesql @SQLCount, @ParmOutput, @val output
     
    --	PRINT @val
    	SELECT @val AS result
    Et donc, la requête s'exécute bien et je récupère bien le résultat dans mon programme.

    Merci

    PS: Je pense que l'on peut fermer le topic ^^

  3. #3
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    Effectivement vous ne pouvez pas récupérer la variable @val parce que lorsque vous exécutez une commande SQL dynamique, et que vous faites EXEC(@SQL), la commande est exécutée dans un autre contexte d'exécution, distinct de celui dans lequel votre procédure stockée s'exécute ...

    Je ne vois pas trop comment vous pourriez le récupérer.
    Finalement, est-bien important ?

    @++

  4. #4
    Membre averti
    Inscrit en
    Février 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 13
    Par défaut
    Pour le fonctionnement de mon application, oui, c'est assez important, car je me sers du résultat de ce select pour compléter un fichier de log

  5. #5
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    Appuyez-vous sur ce test :

    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
    CREATE TABLE TEST
    (
    	val INT
    )
    GO
     
    INSERT INTO TEST VALUES (1)
    INSERT INTO TEST VALUES (2)
    INSERT INTO TEST VALUES (3)
    GO
     
    DECLARE @szNomTable SYSNAME,
    		@SQL NVARCHAR(256),
    		@nbLignes INT
     
    SET @szNomTable = 'TEST'
    SET @SQL = 'SELECT @nbLignesOUT = COUNT(*) FROM dbo.' + @szNomTable
     
    EXEC sp_executesql @SQL, N'@nbLignesOUT INT OUTPUT', @nbLignesOUT = @nbLignes OUTPUT
     
    SELECT @nbLignes
    Retourne 3

    @++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Gerer des codes retour avec BulK Insert
    Par Macfurp dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 26/11/2007, 17h58
  2. BULK INSERT et symbole de retour à la ligne
    Par HULK dans le forum VB.NET
    Réponses: 1
    Dernier message: 20/09/2007, 18h20
  3. Comment préciser nom de la colonne pour un Bulk Insert
    Par jeff37 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 16/06/2004, 17h05
  4. BULK INSERT
    Par jeremie dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 12/03/2004, 13h49
  5. Bulk insert et caractère accentué
    Par slc dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 22/04/2003, 12h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo