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 :

[débutant] Erreur de procédure "Subquery returned more than 1 value"


Sujet :

Développement SQL Server

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 23
    Points : 16
    Points
    16
    Par défaut [débutant] Erreur de procédure "Subquery returned more than 1 value"
    Bonjour,

    j'ai un léger problème avec une procédure stockée. Par moment la procédure fonctionne selon la valeur qu'a Ann_CodePostal, mais la proc me renvoie le plus souvent le message d'erreur suivant :

    Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    @Ann_CodePostal nvarchar(max)
    ,@Rayon int
     
    AS
    SELECT V_Id, V_CP
    FROM (
    SELECT V.V_Id, V.V_CP,
    (6366*acos(cos(radians((SELECT V_Latitude FROM [Villes] WHERE V_CP = @Ann_CodePostal)))*cos(radians(V_Latitude))*cos(radians(V_Longitude)-radians((SELECT V_Longitude FROM [Villes] WHERE V_CP = @Ann_CodePostal)))+sin(radians((SELECT V_Latitude FROM [Villes] WHERE V_CP = @Ann_CodePostal)))*sin(radians(V_Latitude))))
     as Proximite
     from Villes V
    ) t
    WHERE Proximite <@Rayon
    ORDER BY Proximite ASC
    j'avoue être un peu perdu, Si quelqu'un aurait une idée sur la nature de l'erreur cela m'aiderait vachement.

    Merci d'avance.

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 23
    Points : 16
    Points
    16
    Par défaut
    Alors, aprés un peu de recherche je viens de comprendre l'erreur.
    Mes select qui sont dans la formule de calcul me renvoi tout simplement plusieurs resultat.
    Donc je me dit tout bêtement un TOP 1 devrait faire l'affaire mais non nouvelle erreur :

    A domain error occurred.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    @Ann_CodePostal nvarchar(max)
    ,@Rayon int
     
    AS
    SELECT V_CP
    FROM (
    SELECT V.V_CP,
    (6366*acos(cos(radians((SELECT TOP 1 V_Latitude FROM [Villes] WHERE V_CP = @Ann_CodePostal)))*cos(radians(V_Latitude))*cos(radians(V_Longitude)-radians((SELECT TOP 1 V_Longitude FROM [Villes] WHERE V_CP = @Ann_CodePostal)))+sin(radians((SELECT TOP 1 V_Latitude FROM [Villes] WHERE V_CP = @Ann_CodePostal)))*sin(radians(V_Latitude))))
     as Proximite
     from Villes V
    ) t
    WHERE Proximite <@Rayon
    ORDER BY Proximite ASC
    Une idée ?

  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 : 43
    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,

    Le fait que les sous requête vous aient ramené plusieurs valeurs est du au fait que vous devez avoir plusieurs villes dans dans la table VILLE qui ont le même code postal.
    Cela vous oblige à faire un TOP 1, mais qui vous dit que c'est la bonne ville ?

    Il serait probablement plus simple pour vous d'ajouter une colonne calculée Proximite à la table VILLE définie par votre formule de calcul.
    Vous n'auriez ensuite plus qu'à écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT V_CP
    FROM monSchema.VILLE
    WHERE Proximite  < @Rayon
    Dans votre procédure stockée.
    L'ensemble de lignes retourné vous retournera probablement plusieurs lignes, ce qui correspondra au message d'erreur de votre premier post.

    @++

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 23
    Points : 16
    Points
    16
    Par défaut
    Merci pour votre réponse, mais j'avoue ne pas vraiment comprendre.

    Comment ajouter une colonne calculée à ma table ville ?

  5. #5
    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 : 43
    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,

    Vous pouvez faire avec le code qui 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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    ALTER TABLE matable
    ADD Proximite
    	AS
    	(
    		6366
    		*
    		acos
    		(
    			cos
    			(
    				radians(V_Latitude)
    			)
    			*
    			cos
    			(
    				radians(V_Latitude)
    			)
    			*
    			cos
    			(
    				radians(V_Longitude)
    				-
    				radians(V_Longitude)
    				)
    			)
    			+
    			sin
    			(
    				radians(V_Latitude)
    			)
    			*
    			sin
    			(
    				radians(V_Latitude)
    			)
    		)
    	) PERSISTED
    Je ne garantis pas la validité de la formule , c'est seulement pour l'exemple.

    Ensuite, vous pourrez créer un index non-cluster prenant comme colonnes clé V_CP et Proximite.
    Vous êtes pour cela obligé de spécifier PERSISTED, qui indique à SQL Server qu'il doit stocker physiquement les données calculées.
    Dans le cas contraire, une colonne calculée est une colonne virtuelle, qui n'occupe aucun espace physique.

    @++

Discussions similaires

  1. Erreur Subquery returns more than 1 row
    Par incent_bzh dans le forum Requêtes
    Réponses: 2
    Dernier message: 21/01/2014, 11h06
  2. Sujet : erreur "Subquery returns more than 1 row"
    Par dicyz dans le forum Requêtes
    Réponses: 4
    Dernier message: 04/04/2012, 14h08
  3. Réponses: 2
    Dernier message: 11/08/2011, 10h38
  4. Erreur ORA-01427 single-row subquery returns more than one row
    Par SmileAndFly dans le forum Langage SQL
    Réponses: 10
    Dernier message: 29/08/2008, 15h12
  5. Subquery returns more than 1 row
    Par Mathelec dans le forum Requêtes
    Réponses: 12
    Dernier message: 03/08/2006, 14h25

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