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

MS SQL Server Discussion :

pb avec une requête


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 58
    Par défaut pb avec une requête
    Bonjour,

    je migre une appli qui était en MySQL en MSSQL.
    je dois donc reprendre toutes les requêtes utilisant "limit".
    je me sers d'une fonction trouvé sur le site :

    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
    function getLimitMSSQL($start, $nbrows, $fields, $table, $where, $orderfield, $sort = 'asc') { 
    	$top = $start + $nbrows ; 
    	if ( $sort == 'asc' ) { 
    	   $asc = 'asc' ; 
    	   $desc = 'desc' ; 
    	} else { 
    	   $asc = 'desc' ; 
    	   $desc = 'asc' ; 
    	} 
    	$sql = '' ; 
    	   $sql = "SELECT * FROM ( 
    				   SELECT TOP $nbrows $fields from ( 
    				       SELECT TOP $top $fields 
    				       FROM $table 
    				       $where 
    				       ORDER BY $orderfield $asc 
    				   ) tbl1 ORDER BY $orderfield $desc 
    		   ) as tbl2 order by $orderfield $asc 
    	       " ; 
    	return $sql ; 
    }

    Ca fonctionne bien pour certaines requêtes.
    mais là j'ai une erreur que je ne comprends pas.
    voici ma requête :

    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
    SELECT * FROM ( SELECT TOP 50 UTILISATEUR.CODE_UTILISATEUR,
    UTILISATEUR.IDENTIFIANT_UTILISATEUR, CLIENTS.NOM_CLIENT, 
    CLIENTS.CODE_CLIENT, INTERLOCUTEURS.NOM_CONTACT, VALIDITE_COMPTE.DATE_CREATION_COMPTE,
    TYPE_ACCES_UTILISATEUR.TYPE_ACCES_UTILISATEUR, UTILISATEUR.MOT_PASSE_UTILISATEUR,
    VALIDITE_COMPTE.DATE_CLOTURE_COMPTE from ( SELECT TOP 50 UTILISATEUR.CODE_UTILISATEUR, 
    UTILISATEUR.IDENTIFIANT_UTILISATEUR, CLIENTS.NOM_CLIENT, CLIENTS.CODE_CLIENT, INTERLOCUTEURS.NOM_CONTACT,
    VALIDITE_COMPTE.DATE_CREATION_COMPTE, TYPE_ACCES_UTILISATEUR.TYPE_ACCES_UTILISATEUR, 
    UTILISATEUR.MOT_PASSE_UTILISATEUR,VALIDITE_COMPTE.DATE_CLOTURE_COMPTE FROM VALIDITE_COMPTE, 
    TYPE_ACCES_UTILISATEUR, CLIENTS, UTILISATEUR, INTERLOCUTEURS 
    where UTILISATEUR.CODE_CONTACT=INTERLOCUTEURS.CODE_CONTACT 
    and UTILISATEUR.CODE_VALIDITE_COMPTE=VALIDITE_COMPTE.CODE_VALIDITE_COMPTE 
    and INTERLOCUTEURS.CODE_CLIENT=CLIENTS.CODE_CLIENT 
    and VALIDITE_COMPTE.CODE_TYPE_ACCES_UTILISATEUR=TYPE_ACCES_UTILISATEUR.CODE_TYPE_ACCES_UTILISATEUR 
    and VALIDITE_COMPTE.DATE_CLOTURE_COMPTE > '2006-07-03' ORDER BY CLIENTS.NOM_CLIENT asc ) 
    tbl1 ORDER BY CLIENTS.NOM_CLIENT desc ) 
    as tbl2 order by CLIENTS.NOM_CLIENT asc

    j'obtiens ce message d'erreur :

    Warning: mssql_query() [function.mssql-query]: message: L'identificateur en plusieurs parties 'UTILISATEUR.CODE_UTILISATEUR' ne peut pas être lié. (severity 16) in D:\www\ExtranetClient\administration\suiviUtilisateurs.php on line 175

    Warning: mssql_query() [function.mssql-query]: message: L'identificateur en plusieurs parties 'UTILISATEUR.IDENTIFIANT_UTILISATEUR' ne peut pas être lié. (severity 16) in D:\www\ExtranetClient\administration\suiviUtilisateurs.php on line 175

    Warning: mssql_query() [function.mssql-query]: message: L'identificateur en plusieurs parties 'CLIENTS.NOM_CLIENT' ne peut pas être lié. (severity 16) in D:\www\ExtranetClient\administration\suiviUtilisateurs.php on line 175

    Warning: mssql_query() [function.mssql-query]: message: L'identificateur en plusieurs parties 'CLIENTS.CODE_CLIENT' ne peut pas être lié. (severity 16) in D:\www\ExtranetClient\administration\suiviUtilisateurs.php on line 175

    Warning: mssql_query() [function.mssql-query]: message: L'identificateur en plusieurs parties 'INTERLOCUTEURS.NOM_CONTACT' ne peut pas être lié. (severity 16) in D:\www\ExtranetClient\administration\suiviUtilisateurs.php on line 175

    Warning: mssql_query() [function.mssql-query]: message: L'identificateur en plusieurs parties 'VALIDITE_COMPTE.DATE_CREATION_COMPTE' ne peut pas être lié. (severity 16) in D:\www\ExtranetClient\administration\suiviUtilisateurs.php on line 175

    Warning: mssql_query() [function.mssql-query]: message: L'identificateur en plusieurs parties 'TYPE_ACCES_UTILISATEUR.TYPE_ACCES_UTILISATEUR' ne peut pas être lié. (severity 16) in D:\www\ExtranetClient\administration\suiviUtilisateurs.php on line 175

    Warning: mssql_query() [function.mssql-query]: message: L'identificateur en plusieurs parties 'UTILISATEUR.MOT_PASSE_UTILISATEUR' ne peut pas être lié. (severity 16) in D:\www\ExtranetClient\administration\suiviUtilisateurs.php on line 175

    Warning: mssql_query() [function.mssql-query]: message: L'identificateur en plusieurs parties 'VALIDITE_COMPTE.DATE_CLOTURE_COMPTE' ne peut pas être lié. (severity 16) in D:\www\ExtranetClient\administration\suiviUtilisateurs.php on line 175

    Warning: mssql_query() [function.mssql-query]: message: L'identificateur en plusieurs parties 'CLIENTS.NOM_CLIENT' ne peut pas être lié. (severity 16) in D:\www\ExtranetClient\administration\suiviUtilisateurs.php on line 175

    Warning: mssql_query() [function.mssql-query]: message: L'identificateur en plusieurs parties 'CLIENTS.NOM_CLIENT' ne peut pas être lié. (severity 16) in D:\www\ExtranetClient\administration\suiviUtilisateurs.php on line 175

    Warning: mssql_query() [function.mssql-query]: Query failed in D:\www\ExtranetClient\administration\suiviUtilisateurs.php on line 175
    Requête invalide
    ce que je ne comprends pas c'est que si j'isole la requête et lance seulement le "morceau" du milieu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT TOP 50 UTILISATEUR.CODE_UTILISATEUR, 
    UTILISATEUR.IDENTIFIANT_UTILISATEUR, CLIENTS.NOM_CLIENT, CLIENTS.CODE_CLIENT, INTERLOCUTEURS.NOM_CONTACT,
    VALIDITE_COMPTE.DATE_CREATION_COMPTE, TYPE_ACCES_UTILISATEUR.TYPE_ACCES_UTILISATEUR, 
    UTILISATEUR.MOT_PASSE_UTILISATEUR,VALIDITE_COMPTE.DATE_CLOTURE_COMPTE FROM VALIDITE_COMPTE, 
    TYPE_ACCES_UTILISATEUR, CLIENTS, UTILISATEUR, INTERLOCUTEURS 
    where UTILISATEUR.CODE_CONTACT=INTERLOCUTEURS.CODE_CONTACT 
    and UTILISATEUR.CODE_VALIDITE_COMPTE=VALIDITE_COMPTE.CODE_VALIDITE_COMPTE 
    and INTERLOCUTEURS.CODE_CLIENT=CLIENTS.CODE_CLIENT 
    and VALIDITE_COMPTE.CODE_TYPE_ACCES_UTILISATEUR=TYPE_ACCES_UTILISATEUR.CODE_TYPE_ACCES_UTILISATEUR 
    and VALIDITE_COMPTE.DATE_CLOTURE_COMPTE > '2006-07-03' ORDER BY CLIENTS.NOM_CLIENT asc ) 
    tbl1 ORDER BY CLIENTS.NOM_CLIENT desc
    ca fonctionne !
    mais si j'exécute tte la requête, ça plante.
    je ne comprends pas du tout le msg d'erreur
    au départ je pensais que avec MSSQL on ne pouvait pas utiliser la syntaxe : table.Nom de champ ('UTILISATEUR.CODE_UTILISATEUR') mais ce n'est pas ça puisque le partie du milieu fonctionne.

    quelqu'un peut-il m'aider ??

    merci d'avance pour votre aide.

  2. #2
    Membre Expert
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Par défaut
    Bonjour,

    En regardant ton code en diagonale, la première chose à faire est d'appeler tes colonnes préfixées par l'alias de table.
    Si tu fais une sous-requête du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT UTILISATEUR.CODE_UTILISATEUR
    FROM (SELECT UTILISATEUR.CODE_UTILISATEUR FROM UTILISATEUR) tbl1
    Tu obtiendras une erreur.
    SQL Server ne connait pas UTILISATEUR.CODE_UTILISATEUR, mais il connaîtra tbl1.CODE_UTILISATEUR, hors de ta sous-requête.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT tbl1.CODE_UTILISATEUR
    FROM (SELECT UTILISATEUR.CODE_UTILISATEUR FROM UTILISATEUR) tbl1
    Donc, par exemple, au lieu de SELECT TOP 50 UTILISATEUR.CODE_UTILISATEUR, essaie tbl1.CODE_UTILISATEUR, etc.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 58
    Par défaut
    Merci beaucoup Rudib, ça fonctionne en faisant comme tu dis.
    Le truc que je ne comprends pas c'est si dans mes champs SELECT, il y avait 2 champs du mm nom mais de 2 tables différentes, comment ça se passerait ?

  4. #4
    Membre Expert
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Par défaut
    ça se passerait mal
    Pour ça, tu as les alias de colonne à ta disposition.

    Un exemple général :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT tbl1.usercode
    FROM (SELECT u.CODE_UTILISATEUR as usercode FROM UTILISATEUR u) tbl1

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 58
    Par défaut
    oui oui, en fait 2 s après avoir posté (et réfléchi)
    j'avais compris

    en tt cas, merci

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 28/12/2004, 16h15
  2. [Recordset] Incompatibilté de type avec une requête
    Par lbourlet dans le forum Access
    Réponses: 2
    Dernier message: 29/10/2004, 15h52
  3. PB avec une requête Count
    Par Marion dans le forum ASP
    Réponses: 7
    Dernier message: 05/07/2004, 12h56
  4. Pb avec une requête
    Par arsgunner dans le forum ASP
    Réponses: 4
    Dernier message: 14/06/2004, 08h40
  5. problème avec une requête imbriquée
    Par jaimepasteevy dans le forum Langage SQL
    Réponses: 13
    Dernier message: 05/12/2003, 10h29

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