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 08/06/2011, 15h55   #1
Futur Membre du Club
 
Femme Audrey
Étudiant
Inscription : avril 2011
Messages : 71
Détails du profil
Informations personnelles :
Nom : Femme Audrey
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2011
Messages : 71
Points : 17
Points : 17
Par défaut SELECT dans UPDATE

Bonjour,

Voilà, je cherche désespérément à faire un SELECT pour une valeur de mon UPDATE.
En fait, je vous explique brièvement le pourquoi du comment : j'ai un formulaire, et la personne qui saisit rentre le nom de l'activité de la personne concernée en clair, et quand je récupère cela, il faut que j'écrive dans le table agent le numéro correspondant à l'intitulé de l'activité qu'a rentré la personne qui saisie...

Voici ce que j'ai essayé :

Code :
1
2
3
4
5
6
7
8
9
10
MODIF = "UPDATE agent " _
+ "SET id_geode		= '"& Request("txtBxIdRh") &"', 			" _
+ "civilite		= '"& Request("txtBxCivilite") &"', 			" _
+ "nom			= '"& Request("txtBxNom") &"', 				" _
+ "prenom		= '"& Request("txtBxPrenom") &"', 			" _
+ "id_fonction		= (SELECT agent.id_fonction, fonction.id_fonction, fonction.intitule_fonction		 " _
+ "			FROM agent, fonction		" _
+ "			WHERE fonction.intitule_fonction = '"& Request("txtBxId_Fonction") &"' AND agent.id_fonction = fonction.id_fonction),	" _	
+ "type_acces		= "& acces &"								" _
+ "WHERE id_geode 	= '"& Request("txtBxIdRh") &"' 				"
Si je n'ai pas été assez claire...

Toutes remarques, tout conseils... seront là bienvenue.

Audrey
audrey1912 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2011, 16h06   #2
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour

Vous essayez d'assigner à une colonne (id_fonction) le résultat d'une requête renvoyant plusieurs colonnes... SQL Server ne va pas choisir à votre place la bonne valeur !

En plus votre requête retourne plusieurs lignes, une par agent. Vous n'avez pas besoin de jointure sur agent dans votre sous requête, dont le but est uniquement de trouver l'id d'une fonction à partir de son intitulé :

à partir de votre requête, vous pouvez faire :

Code :
1
2
3
4
5
6
7
8
9
10
11
 
MODIF = "UPDATE agent " _
+ "SET id_geode		= '"& Request("txtBxIdRh") &"', 			" _
+ "civilite		= '"& Request("txtBxCivilite") &"', 			" _
+ "nom			= '"& Request("txtBxNom") &"', 				" _
+ "prenom		= '"& Request("txtBxPrenom") &"', 			" _
+ "id_fonction		= (SELECT fonction.intitule_fonction		 " _
+ "			FROM fonction		" _
+ "			WHERE intitule_fonction = '"& Request("txtBxId_Fonction") &"' AND agent.id_fonction = fonction.id_fonction),	" _	
+ "type_acces		= "& acces &"								" _
+ "WHERE id_geode 	= '"& Request("txtBxIdRh") &"'
Il reste à s'assurer que "intitulé fonction" est unique, pour cela, ajoutez (si elle n'existe pas déjà) une contrainte d'unicité sur cette colonne.

Mais vous pouvez faire plus simplement avec un UPDATE ... FROM

Quelque chose comme :

Code SQL :
1
2
3
4
5
6
7
8
 
UPDATE Agent
SET id_geode = ...
...
id_fonction = F.id_fonction
FROM fonction F
WHERE F.intitule_fonction = '...'
AND id_geode = ...
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2011, 16h31   #3
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,

Quelque chose m'échappe : j'ai réécrit votre requête comme suit :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
UPDATE		dbo.Agent
SET		id_geode = @_txtBxIdRh
		, civilite = @_txtBxCivilite
		, nom = @_txtBxNom
		, prenom = @_txtBxPrenom
		, id_fonction = F.id_fonction
		, type_acces = @_acces
FROM		dbo.Agent AS A
INNER JOIN	dbo.Fonction AS F
			ON A.id_fonction = F.id_fonction
WHERE		A.id_geode = @_txtBxIdRh
AND		F.intitule_fonction = @_txtBxId_Fonction
Si je comprend bien un Agent peut avoir plusieurs fonctions ...
Sans cela l'id_fonction restera identique puisque la jointure se fait sur l'id_fonction ...

Aujourd'hui, au travail comme sur le forum, j'ai vu combien il est compliqué et lourd d'écrire une requête dans le code d'une classe, alors qu'un appel à une procédure stockée est si simple ...

Code :
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
CREATE PROCEDURE maProcedure
	@_txtBxIdRh [type]
	, @_txtBxCivilite [type]
	, @_txtBxNom [type]
	, @_txtBxPrenom [type]
	, @_acces [type]
	, @_txtBxIdRh [type]
	, @_txtBxId_Fonction [type]
AS
BEGIN
	SET NOCOUNT ON
 
	UPDATE		dbo.Agent
	SET		id_geode = @_txtBxIdRh
			, civilite = @_txtBxCivilite
			, nom = @_txtBxNom
			, prenom = @_txtBxPrenom
			, id_fonction = F.id_fonction
			, type_acces = @_acces
	FROM		dbo.Agent AS A
	INNER JOIN	dbo.Fonction AS F
				ON A.id_fonction = F.id_fonction
	WHERE		A.id_geode = @_txtBxIdRh
	AND		F.intitule_fonction = @_txtBxId_Fonction
END
Il suffit ensuite d'appeler la procédure stockée, ce qui doit bien faire un paquet de lignes de code en moins dans votre classe

@++
__________________
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 déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2011, 09h09   #4
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

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

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
MODIF = "UPDATE agent " _
+ "SET id_geode = '"& Request("txtBxIdRh") &"', " _
+ "civilite = '"& Request("txtBxCivilite") &"', " _
+ "nom = '"& Request("txtBxNom") &"', " _
+ "prenom = '"& Request("txtBxPrenom") &"', " _
+ "id_fonction = (SELECT agent.id_fonction, fonction.id_fonction, fonction.intitule_fonction " _
+ " FROM agent, fonction " _
+ " WHERE fonction.intitule_fonction = '"& Request("txtBxId_Fonction") &"' AND agent.id_fonction = fonction.id_fonction), " _
+ "type_acces = "& acces &" " _
+ "WHERE id_geode = '"& Request("txtBxIdRh") &"'

O la belle requête toute pleine d'injection SQL :-)

Pensez au SqlParameters pour protéger vos requêtes.
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 10h03   #5
Futur Membre du Club
 
Femme Audrey
Étudiant
Inscription : avril 2011
Messages : 71
Détails du profil
Informations personnelles :
Nom : Femme Audrey
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2011
Messages : 71
Points : 17
Points : 17
Bonjour,

Tout d'abord, désolée d'avoir mis autant de temps à répondre.
Merci à vous tous pour vos réponses!! Cela fonctionne très bien.

En revanche, j'aimerais savoir, iberserk, ce que sont les SqlParameters ?

Merci d'avance.

Audrey
audrey1912 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 10h24   #6
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

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

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Google est toujours votre ami:
http://msdn.microsoft.com/fr-fr/libr...(v=vs.80).aspx
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 10h56   #7
Futur Membre du Club
 
Femme Audrey
Étudiant
Inscription : avril 2011
Messages : 71
Détails du profil
Informations personnelles :
Nom : Femme Audrey
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2011
Messages : 71
Points : 17
Points : 17
En effet, pas pensé à chercher, absorber pas autre chose...

Merci encore à vous trois.
audrey1912 est dé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 20h58.


 
 
 
 
Partenaires

Hébergement Web