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

MS SQL Server Discussion :

[2000] Récupérer la valeur de retour d'une procédure stockée


Sujet :

MS SQL Server

  1. #1
    Membre actif
    Inscrit en
    Juin 2003
    Messages
    270
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 270
    Points : 216
    Points
    216
    Par défaut [2000] Récupérer la valeur de retour d'une procédure stockée
    Bonjour,

    Je souhaite récupérer la valeur de retour de la procédure stockée suivante (dont je ne peux pas modifier le code):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    create procedure sp_nextkey @table VARCHAR(30) as 
    set nocount on 
    DECLARE @tablename VARCHAR(30)
     
    IF @table = 'SYSTEMKEY' BEGIN 
     INSERT INTO DOCSADM.MyTable (FIELD) VALUES (0) 
     DELETE FROM DOCSADM.MyTable WHERE LASTKEY = SCOPE_IDENTITY() 
     SELECT SCOPE_IDENTITY() 
    END 
     
    GO
    Est-ce possible ? Si oui, comment ?

    J'ai essayé la syntaxe suivante sans succès (au sein d'une autre procédure stockée):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Declare @LASTKEY integer
     @LASTKEY = exec DOCSADM.SP_NEXTKEY 'SYSTEMKEY'

  2. #2
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Bonjour,

    La syntaxe pour la valeur de retour est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Declare @LASTKEY integer
    exec @LASTKEY = DOCSADM.SP_NEXTKEY 'SYSTEMKEY'
    Par contre, tu ne récupéreras pas ton SCOPE_IDENTITY de cette façon, puisqu'il est renvoyé par un SELECT et non pas un RETURN.
    Tu dois le récupérer dans un recordset. Si tu l'appelles depuis du SQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CREATE TABLE #tmp (id int)
    INSERT INTO #tmp
    EXEC DOCSADM.SP_NEXTKEY 'SYSTEMKEY'
    Evite de préfixer tes procédures par sp_, pour des raisons de performance
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

  3. #3
    Membre actif
    Inscrit en
    Juin 2003
    Messages
    270
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 270
    Points : 216
    Points
    216
    Par défaut
    Bonjour,

    merci pour cette réponse très complète !

    J'ai également vu qu'il était possible dans ce cas d'utiliser la fonction IDENT_CURRENT('Nom_Table') qui permet de récupérer le dernier identifiant insérer dans une table:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT @LASTKEY = IDENT_CURRENT('MyTable')
    Pourquoi les procédures stockées préfixées par sp_ sont elles moins performantes ?

    Merci encore !

  4. #4
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    IDENT_CURRENT() est moins approprié, parce qu'il te retournera une valeur même si elle a été insérée par une autre connexion.

    Quand SQL Server voit une procédure préfixée par sp_, il la considère comme une procédure système, et va d'abord la chercher dans la base Master. S'il ne la trouve pas, il revient dans la base courante pour la trouver. Tu perds donc le temps de cet aller-retour.
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 434
    Points : 502
    Points
    502
    Par défaut
    Citation Envoyé par rudib
    Par contre, tu ne récupéreras pas ton SCOPE_IDENTITY de cette façon, puisqu'il est renvoyé par un SELECT et non pas un RETURN.
    Tu dois le récupérer dans un recordset. Si tu l'appelles depuis du SQL :
    +1

    Citation Envoyé par rudib
    Evite de préfixer tes procédures par sp_, pour des raisons de performance
    Ah ces professionnels ! Sont pointilleux quand même

    L'aller-retour master/base user est quand même pas ce qui consomme le plus de temps
    Sauf bien sur si un vrai DBA a fait un vrai travail de placement des bases sur des partitions différentes sur serveurs différents, réseau pourri et des 10aine milliers de procédures dans master

    Je taquine Rudi bien sur

  6. #6
    Membre actif
    Inscrit en
    Juin 2003
    Messages
    270
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 270
    Points : 216
    Points
    216
    Par défaut
    Ok, merci pour ces précisions.

    Chez developpez, on leur demande ça, ils nous donnent CA !

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 22/02/2013, 15h24
  2. Réponses: 7
    Dernier message: 28/10/2010, 21h55
  3. Récupérer des valeurs à l'aide d'une procédure stockée
    Par Contact2012 dans le forum Développement
    Réponses: 7
    Dernier message: 02/09/2008, 15h02
  4. Réponses: 1
    Dernier message: 19/03/2008, 11h01
  5. Valeur de retour d'une procédure stockée
    Par Rudyweb dans le forum MFC
    Réponses: 4
    Dernier message: 25/02/2005, 17h52

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