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 :

SELECT dans UPDATE


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 103
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    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
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 = ...

  3. #3
    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 : 44
    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
    Par défaut
    Bonjour,

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : 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
    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

    @++

  4. #4
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 795
    Par défaut
    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.

  5. #5
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 103
    Par défaut
    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

  6. #6
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 795

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

Discussions similaires

  1. Double-Select dans Update
    Par mactwist69 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 18/12/2009, 14h39
  2. Select Dans Update
    Par mactwist69 dans le forum Requêtes
    Réponses: 1
    Dernier message: 18/12/2009, 14h39
  3. [SQL] Erreur dans UPDATE SELECT simple
    Par daner06 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 14/12/2006, 15h58
  4. [MySQL] un select dans un update
    Par Yoshio dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 18/09/2006, 19h07
  5. Inclure un SELECT dans une requète Update
    Par carolinebelle dans le forum Langage SQL
    Réponses: 2
    Dernier message: 19/07/2005, 14h19

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