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 :

sp_executesql n'exécute pas le code..


Sujet :

Développement SQL Server

  1. #1
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    415
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 415
    Points : 138
    Points
    138
    Par défaut sp_executesql n'exécute pas le code..
    Bonjour,
    j'ai la proc stock suivante qui au lieu de faire l'update, me fait un select de @SQLString et retourne 0. Vous savez pourquoi? sp_executesql est bien sensé exécuter le contenu de la chaîne de caractères, non?
    Le contenu qui m'est retourné de SQLString est :
    update RequestPayment set Status = @Status from RequestPayment rp where rp.RequestPaymentOID in (5,6)
    J'appelle la proc stock de cette manière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    declare @ret int
    exec @ret = upd_csa_RequestPayment '5,6', 'V'
    select @ret
    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
    CREATE PROCEDURE [dbo].[upd_csa_RequestPayment]
    	-- Add the parameters for the stored procedure here
    	(	
    		@OIDList nvarchar(3500),
    		@Status nchar(1)
    	)
    AS
    BEGIN
    	DECLARE @error INT, @SQLString nvarchar(4000), @CharVariable nchar(1), @ParmDefinition nvarchar(50)
     	SET @error = 0
     	select @CharVariable = @Status
     	select @ParmDefinition = N'@Status nchar(1)'
     
     	select SQLString = N'update RequestPayment
    					     set Status = @Status
    					     from RequestPayment rp
    					     where rp.RequestPaymentOID in (' + @OIDList + N')'
     
     	/*if ()
     		GOTO NOK1*/
     
    	begin transaction update_RequestPayment
     
    	EXECUTE sp_executesql @SQLString, @ParmDefinition,
    						  @Status = @CharVariable
     
    	set @error = @@ERROR
    	if @error = 0
    	begin
    		GOTO OK
    	end
    	else
    	begin
    		GOTO NOK2
    	end
     
     
    	OK:
    		commit transaction update_RequestPayment
    		return 0
     
    	/*NOK1:
    		return -1*/
     
    	NOK2:
    		rollback transaction update_RequestPayment
    		return -2
     
     
    END

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 759
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 759
    Points : 52 540
    Points
    52 540
    Billets dans le blog
    5
    Par défaut
    1) Faites une exécution avec EXEC (@Machaine) au lieu de sp_executeSQL, et voyez avec un print ce que contient la variable.
    2) l'utilisation des GOTO est à proscrire. Utilisez des blocs TRY / CATCH.
    3) nommer des transaction ne sert pas à grand chose

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    415
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 415
    Points : 138
    Points
    138
    Par défaut
    Exec(machaine) c'est ce que j'ai fait au début mais il s'attend à executer une procedure stockée. Sinon pour le contenu de la chaîne à executer, il est indiqué en citation dans mon 1er message.

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 759
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 759
    Points : 52 540
    Points
    52 540
    Billets dans le blog
    5
    Par défaut
    Voila comment écrire votre proc

    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
    CREATE PROCEDURE [dbo].[upd_csa_RequestPayment]
    		@OIDList nvarchar(3500),
    		@STATUS nchar(1),
    		@RETVAL INT OUTPUT
    AS
    BEGIN
     
    BEGIN TRY
     
        DECLARE @SQLString nvarchar(max);
     
     	SET SQLString = N'update RequestPayment
    					     set Status = ''' + @Status + 
    					     '''from RequestPayment rp
    					     where rp.RequestPaymentOID in (' + @OIDList + N');'
     
     	EXEC (@SQLString);
     
     	SET @RETVAL = 0;
     
    END TRY
    BEGIN CATCH
     
     	SET @RETVAL = -2;
     
    END CATCH
     
    END
    Nombreuses erreurs :
    1) ne pas utiliser RETURN n. En effet, retourner une valeur écrase la pile des erreurs. En fait la valeur retourner par RETURN est le code d'erreur. Utilisez une variable en OUTPUT pour ce faire, si vous désirez renvoyer une information personnalisée d'ereur, ou alors lancez une instruction RAISERROR.
    2) tout ordre de mise à jour est une transaction. Il est donc parfaitement inutile de rajouter une transaction explicite.
    3) les transactions nommées ne servent à rien en pratique
    4) utilisez de préférence EXEC (@Mavariablechaine) à sp_executeSQL lorsque l'ordre SQL est peu complexe.
    5) pour gérer des erreurs, utilisez les bloc TRY CATCH au lieu de la programmation spaghetti à l'aide de GOTO ! (dixit l'aide en ligne : Utilisez l'instruction GOTO avec parcimonie)

    Bref, formez vous à Transact SQL !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Votre erreur vient de là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT SQLString = N'update RequestPayment
    					     set Status = @Status
    					     from RequestPayment rp
    					     where rp.RequestPaymentOID in (' + @OIDList + N')'
    vous n'affectez pas la chaine à votre variable, mais vous faite une requête dont le résultat contient une seule colonne qui s’appelle SQLString, c'est la requete que vous voyez, et du coup votre EXEC éxecute une chaine vide.

    Ajoutez l'@ :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT @SQLString = N'update RequestPayment
    					     set Status = @Status
    					     from RequestPayment rp
    					     where rp.RequestPaymentOID in (' + @OIDList + N')'

  6. #6
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    415
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 415
    Points : 138
    Points
    138
    Par défaut
    merci aieeeuuuuu pour votre aide, c'était effectivement juste un problème lié à l'oubli du @...
    Attention SQLPro, la correction que vous m'avez donnée ne fonctionne pas du coup mais merci quand même d'avoir pris quelques instants pour tenter de résoudre le problème.

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

Discussions similaires

  1. [EasyPHP] EasyPHP n'exécute pas le code php
    Par tyranosaure dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 17/08/2009, 08h41
  2. [AJAX] code javascript qui ne s'excute pas
    Par backfire dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 21/05/2008, 15h10
  3. [2007][VBA]le code ne s'exécute pas
    Par Kenia dans le forum VBA Access
    Réponses: 2
    Dernier message: 19/05/2008, 18h39
  4. Notepad++ n'exécute pas le code sous Firefox
    Par gesalz dans le forum Débuter
    Réponses: 3
    Dernier message: 01/02/2008, 17h21
  5. Le code vba ne s'exécute pas.
    Par Halima91 dans le forum VBA Access
    Réponses: 3
    Dernier message: 20/03/2007, 10h45

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