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 :

retour de valeur dans procédure


Sujet :

Développement SQL Server

  1. #1
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 383
    Points : 2 996
    Points
    2 996
    Par défaut retour de valeur dans procédure
    Bonjour,

    J'utilise une procédure stockée pour insérer une ligne dans une table et renvoyer l'id de la nouvelle ligne. Après mon "INSERT INTO" je fais un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT @id = IDENT_CURRENT('fichiers')
    Mais ça ne fonctionne pas. Je dois rajouter une ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	SELECT @id = IDENT_CURRENT('fichiers')
    	SELECT @id
    Est-ce normal ?

    Papy

  2. #2
    Membre émérite

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Points : 2 856
    Points
    2 856
    Par défaut
    avez-vous défini le paramètre @id comme paramètre de sorti (OUTPUT) ?

    A+
    Etienne ZINZINDOHOUE
    Billets-Articles

  3. #3
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 383
    Points : 2 996
    Points
    2 996
    Par défaut
    En fait, ma procédure (simplifiée au niveau de la requête) est structurée comme suit:

    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
     
    CREATE PROCEDURE [dbo].[AjouteFichier] 
    	@champ1 varchar(255), @champ2 varchar(255)
    AS
    BEGIN
    	DECLARE @id integer	
    	 INSERT
    	 INTO   fichiers
    			(
    				   champ1,
    				   champ2
    			)
    			VALUES
    			(
    				   @champ1,
    				   @champ2
    			)
    	SELECT @id = IDENT_CURRENT('fichiers')
    	SELECT @id 
    END
    Et dans mon code pascal, je récupère le champ dans le recordset obtenu.

    J'ai peut-être fait tout de travers ? :-(

  4. #4
    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 : 42
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    C'est plutôt pas mal, mais il y a quelques petites erreurs : n'utilisez pas IDENT_CURRENT() pour récupérer l'identifiant d'une ligne que vous venez d'insérer.
    Vous préférerez SCOPE_IDENTITY() qui retourne l'identifiant de la ligne insérée par la transaction juste avant son appel.
    Si vous utilisez IDENT_CURRENT() et que de nombreuses lignes sont insérées en même temps, il est possible que vous n'obteniez pas l'identifiant qui correspond à la ligne que vous venez d'insérer.
    En effet cette fonction n'a pas de limite de portée, tandis que SCOPE_IDENTITY() est limitée à la portée du module dans laquelle elle est appelée.

    D'autre part, veillez à toujours qualifier le nom des objets que vous manipulez par le nom du schéma auquel ils appartiennent : ici c'est dbo, le schéma par défaut.

    Enfin vous pouvez utiliser la clause OUTPUT pour vous retourner la valeur de l'identifiant, ce qui donne :

    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
    CREATE PROCEDURE [dbo].[AjouteFichier] 
    	@champ1 varchar(255)
    	, @champ2 varchar(255)
    	, @id int = NULL OUTPUT
    AS
    BEGIN
    	SET NOCOUNT ON
     
    	INSERT	INTO dbo.fichiers
    	(
    		champ1
    		, champ2
    	)
    	VALUES
    	(
    		@champ1
    		, @champ2
    	)
     
    	SELECT @id = SCOPE_IDENTITY()
    END
    GO
    Et à l'utilisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DECLARE @id_fichier int
    EXEC dbo.AjouteFichier 'a', 'b', @id_fichier OUTPUT
    SELECT @id_fichier
    Je ne sais pas si Pascal gère ce type de paramètres.
    Si ce n'est pas le cas, vous pouvez conserver le code que vous avez écrit, en le modifiant avec les recommandations que je vous ai faites plus haut

    @++

  5. #5
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 383
    Points : 2 996
    Points
    2 996
    Par défaut
    Merci pour cette aide précise et claire.

    Dans mon code Delphi, j'ai pu récupérer la valeur renvoyée dans un paramètre défini comme "retour de valeur" et ça fonctionne très bien.

    J'ai mis votre blog dans mes favoris, même si pour l'instant je n'ai pas vraiment le niveau requis pour tout comprendre.

  6. #6
    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 : 42
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Avec plaisir !

    Si vous ne comprenez pas, demandez sur le forum !

    @++

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 17/02/2011, 16h39
  2. Récupérer valeur dans procédure stockée
    Par Mygush dans le forum Développement
    Réponses: 4
    Dernier message: 22/12/2009, 16h38
  3. Réponses: 23
    Dernier message: 28/05/2008, 17h53
  4. Retour de valeur par procédure.
    Par pkrvz dans le forum VBA Access
    Réponses: 3
    Dernier message: 31/03/2008, 19h29
  5. PB de retour de valeur dans formulaire
    Par Poutchou dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 05/04/2006, 16h10

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