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 :

Pas de données en sortie pour ma table avec sqlserver


Sujet :

Développement SQL Server

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Pas de données en sortie pour ma table avec sqlserver
    Bonjour,
    je bataille depuis un certain temps avec une procédure stockée avec sql server 2005. Je ne comprends pas pourquoi j' ai juste les noms des colonnes sans données en sortie et donc ce que je devrais faire pour afficher le résultat complet.
    Merci à vous.

    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
     
    USE Magasin
    IF EXISTS 
    (
    	SELECT name 
    	FROM sysobjects 
    	WHERE name ='ClientsParCategorie' 
    	AND type = 'P'
    ) 
    DROP PROCEDURE ClientsParCategorie
    GO
     
    CREATE PROCEDURE ClientsParCategorie @Nom_cat VARCHAR(30)
    AS
    BEGIN
    	SELECT cli.Nom_client, com.Date_com,  prod.Titre_prod
    	FROM client cli, categorie cat, commande com,
    	 produit prod, detail_commande det
    	WHERE cli.Id_client = com.Id_client
    	AND com.Id_com = det.Id_com
    	AND det.Id_prod = prod.Id_prod
    	AND  prod.Id_prod = cat.Id_cat
    	AND cat.id_cat = 
    	( 	
    		SELECT id_cat 
    		FROM categorie
    		WHERE UPPER(cat.Nom_cat) 
    		LIKE UPPER('%'+@Nom_cat+'%')
    	)
    END
    GO
     
     
    EXECUTE ClientsParCategorie 'imprimantes'
    GO

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 32
    Points : 36
    Points
    36
    Par défaut
    Difficile de répondre car il faudrait connaître le contenu de chaque table Voici quelques suggestions.

    Il me semble tout d'abord que la requête peut être simplifiée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT cli.Nom_client, com.Date_com,  prod.Titre_prod
    FROM client cli, categorie cat, commande com, produit prod, detail_commande det
    WHERE cli.Id_client = com.Id_client
    AND com.Id_com = det.Id_com
    AND det.Id_prod = prod.Id_prod
    AND  prod.Id_prod = cat.Id_cat
    AND UPPER(cat.Nom_cat) LIKE UPPER('%'+@Nom_cat+'%')
    Ensuite est-ce que la requête suivante renvoie des résultats (en dehors de la procédure bien sûr) ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT cli.Nom_client, com.Date_com,  prod.Titre_prod
    FROM client cli, categorie cat, commande com, produit prod, detail_commande det
    WHERE cli.Id_client = com.Id_client
    AND com.Id_com = det.Id_com
    AND det.Id_prod = prod.Id_prod
    AND  prod.Id_prod = cat.Id_cat
    AND UPPER(cat.Nom_cat) LIKE '%IMPRIMANTES%'
    Si non, il faut commencer par une requête simple et la compliquer progressivement pour savoir à partir de quel moment il n'y a plus de résultat (TOP 1 permet de remonter juste une ligne et pas tout le contenu de la table ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT TOP 1 *
    FROM client cli, commande com
    WHERE cli.Id_client = com.Id_client
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT TOP 1 *
    FROM client cli, commande com, detail_commande det
    WHERE cli.Id_client = com.Id_client
    AND com.Id_com = det.Id_com
    etc...
    ________________________________
    Seminoque, créateur de
    http://www.bingokaz.com

  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 : 42
    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 devriez spécifier vos jointures par le mot-clé [INNER] JOIN :

    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
    -- Toutes versions 
    SELECT CLI.Nom_client,
    		COM.Date_com,
    		PROD.Titre_prod
    FROM dbo.client CLI,
    JOIN commande COM ON CLI.Id_client = COM.Id_client
    JOIN detail_commande DET ON COM.Id_com = DET.Id_com
    JOIN produit PROD ON DET.Id_prod = PROD.Id_prod
    JOIN categorie CAT ON PROD.Id_prod = CAT.Id_cat
    JOIN
    (
    	SELECT id_cat 
    	FROM categorie
    	WHERE UPPER(cat.Nom_cat) 
    	LIKE UPPER('%'+@Nom_cat+'%')
    ) TMP ON TMP.id_cat = CAT.id_cat
     
    -- Depuis SQL Server 2005
    WITH
    	CTE AS
    	(
    		SELECT id_cat 
    		FROM categorie
    		WHERE UPPER(cat.Nom_cat) 
    		LIKE UPPER('%'+@Nom_cat+'%')
    	)
    SELECT CLI.Nom_client,
    		COM.Date_com,
    		PROD.Titre_prod
    FROM dbo.client CLI
    JOIN dbo.commande COM ON CLI.Id_client = COM.Id_client
    JOIN dbo.detail_commande DET ON COM.Id_com = DET.Id_com
    JOIN dbo.produit PROD ON DET.Id_prod = PROD.Id_prod
    JOIN dbo.categorie CAT ON PROD.Id_prod = CAT.Id_cat
    JOIN CTE ON CTE.id_cat = CAT.id_cat
    Ce qui vous permet de séparer vos jointures de vos filtres (WHERE) et de faciliter le travail du compilateur.
    Dès lors pour tester où la jointure ne se fait pas, vous devrez écrire des demi-jointures (LEFT [OUTER] JOIN dans le cas présent).

    @++

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Merci beaucoup pour tous ces bons conseils,
    je suis débutant avec sql server mais j' ai fait un peu d' Oracle ; je pensais en fait que c' était dû à un paramétrage particulier qu' il fallait faire pour avoir ces données en sortie.
    Je vais donc employer votre méthodologie et je vous tiens au courant

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 761
    Points : 52 548
    Points
    52 548
    Billets dans le blog
    5
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WHERE UPPER(cat.Nom_cat) 
    LIKE UPPER('%'+@Nom_cat+'%')
    Ceci est idiot en terme sémantique et plus encore en terme de perforances. Utilisez une collation pour résoudre ce problème. Venant d'Oracle il est normal que vous ne connaissiez pas le principe des collations qui fait partie de la norme SQL et qu'Oracle n'a jamais implémenté.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE cat.Nom_cat LIKE '%'+@Nom_cat+'%' COLLATE French_CI_AI
    voir l'article que j'ai écrit à ce sujet : http://sqlpro.developpez.com/cours/s...er/collations/

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    J' ai réussi à résoudre mon problème ainsi finalement. Merci à vous

    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
     
    USE Magasin
     
    IF EXISTS 
    	(
    		SELECT name 
    		FROM sysobjects 
    		WHERE name ='ClientsParCategorie' 
    		AND type = 'P'
    	) 
    	DROP PROCEDURE ClientsParCategorie
    	GO
     
    CREATE PROCEDURE ClientsParCategorie @Nom_cat VARCHAR(30)
    	AS
    BEGIN
    	SELECT CLI.Nom_client, COM.Date_com, PROD.Titre_prod
              FROM client CLI 
               INNER JOIN commande COM ON COM.Id_client = CLI.Id_client
               INNER JOIN detail_commande DET ON DET.Id_com = COM.Id_com
               INNER JOIN produit PROD ON PROD.Id_prod = DET.Id_prod
               INNER JOIN categorie CAT ON CAT.Id_cat = PROD.Id_cat
               WHERE cat.Nom_cat LIKE '%'+@Nom_cat+'%' COLLATE French_CI_AI
    END

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

Discussions similaires

  1. [ZF 1.11] creation des model pour une table avec des clés etrangères
    Par diengkals dans le forum Zend Framework
    Réponses: 4
    Dernier message: 09/05/2013, 14h55
  2. [Débutant] Pas de données de sortie à ma fonction
    Par DocDjul dans le forum MATLAB
    Réponses: 10
    Dernier message: 04/07/2012, 14h40
  3. Réponses: 0
    Dernier message: 15/03/2008, 11h13
  4. [MySQL] mysql_fetch_assoc pour 2 tables avec relation 1-1
    Par jiojioforever dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 26/01/2007, 09h41
  5. lien pour une table qui ne doit pas etre public
    Par raslain dans le forum Oracle
    Réponses: 1
    Dernier message: 12/12/2005, 13h40

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