Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/10/2011, 10h12   #1
Membre chevronné
 
Inscription : novembre 2007
Messages : 1 154
Détails du profil
Informations personnelles :
Âge : 50

Informations forums :
Inscription : novembre 2007
Messages : 1 154
Points : 659
Points : 659
Envoyer un message via ICQ à Papy214
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 :
SELECT @id = IDENT_CURRENT('fichiers')
Mais ça ne fonctionne pas. Je dois rajouter une ligne:

Code :
1
2
3
 
	SELECT @id = IDENT_CURRENT('fichiers')
	SELECT @id
Est-ce normal ?

Papy
Papy214 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/10/2011, 10h53   #2
Membre Expert
 
Homme Etienne ZINZINDOHOUE
Ingénieur développement
Inscription : mars 2010
Messages : 1 139
Détails du profil
Informations personnelles :
Nom : Homme Etienne ZINZINDOHOUE
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Ingénieur développement
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2010
Messages : 1 139
Points : 2 467
Points : 2 467
Envoyer un message via Yahoo à zinzineti
avez-vous défini le paramètre @id comme paramètre de sorti (OUTPUT) ?

A+
__________________
Etienne ZINZINDOHOUE
Billets-Articles
zinzineti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/10/2011, 11h28   #3
Membre chevronné
 
Inscription : novembre 2007
Messages : 1 154
Détails du profil
Informations personnelles :
Âge : 50

Informations forums :
Inscription : novembre 2007
Messages : 1 154
Points : 659
Points : 659
Envoyer un message via ICQ à Papy214
En fait, ma procédure (simplifiée au niveau de la requête) est structurée comme suit:

Code :
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 ? :-(
Papy214 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/10/2011, 14h45   #4
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 669
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

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

Informations forums :
Inscription : janvier 2005
Messages : 4 669
Points : 8 729
Points : 8 729
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 :
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 :
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

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/10/2011, 17h09   #5
Membre chevronné
 
Inscription : novembre 2007
Messages : 1 154
Détails du profil
Informations personnelles :
Âge : 50

Informations forums :
Inscription : novembre 2007
Messages : 1 154
Points : 659
Points : 659
Envoyer un message via ICQ à Papy214
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.
Papy214 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/10/2011, 05h43   #6
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 669
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

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

Informations forums :
Inscription : janvier 2005
Messages : 4 669
Points : 8 729
Points : 8 729
Avec plaisir !

Si vous ne comprenez pas, demandez sur le forum !

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h25.


 
 
 
 
Partenaires

Hébergement Web