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 :

[SQL2005] [TSQL] Procédure stockée


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut [SQL2005] [TSQL] Procédure stockée
    Bonjour tout le monde !

    Voilà, j'aimerai savoir si, dans une procédure stockée, il me serait possible de récupérer les clés primaires de toutes les lignes d'une table (typiquement les ids) pour construire une autre requête SQL. Par exemple (parce que je ne suis pas sûre que ça soit très clair pour l'instant), je voudrais pouvoir générer une requête du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT A.id, A.name, FCT_COUNT(1) AS count1, ..., FCT_COUNT(n) AS countn FROM A
    où FCT_COUNT est une "fonction stockée" prenant un id d'une table B en paramètre.
    Mon problème est d'arriver à récuprérer les identifiants 1..n et de boucler dessus pour générer cette requête. Est-ce possible ?

    Merci d'avance !
    Dernière modification par Invité ; 24/12/2007 à 10h15.

  2. #2
    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,

    Comme FCT_COUNT est une fonction que tu as définie, tu n'as pas besoin de FCT_COUNT() pour chaque ID.
    Tu peux directement écrire ta requête en utilisant FCT_COUNT(ID_TABLE_B) dans le SELECT, en y ajoutant la jointure qui convient entre les tables A et B, à mon avis le traitement en sera bien plus rapide ...
    Si c'est la présentation que tu recherches, il est préférable de gérer cela dans l'application cliente

    A+ ElSuket.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Merci pour ta réponse !

    Citation Envoyé par elsuket Voir le message
    Comme FCT_COUNT est une fonction que tu as définie, tu n'as pas besoin de FCT_COUNT() pour chaque ID.
    Tu peux directement écrire ta requête en utilisant FCT_COUNT(ID_TABLE_B) dans le SELECT, en y ajoutant la jointure qui convient entre les tables A et B, à mon avis le traitement en sera bien plus rapide ...
    Si je fais comme tu dis, soit un truc du genre...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT A.id, A.name, FCT_COUNT(B.id) AS count FROM A, B WHERE [jointure qui va bien]
    si j'ai bien compris ce que tu dis (hésite pas à me corriger si j'ai mal compris !) J'aurais plusieurs lignes pour obtenir ma valeur de FCT_COUNT pour chaque id de B non ? Il me faut toutes les informations dans la même ligne de résultat.

    Citation Envoyé par elsuket Voir le message
    Si c'est la présentation que tu recherches, il est préférable de gérer cela dans l'application cliente
    En fait, pour l'instant, j'effectue plusieurs requêtes séparées pour obtenir, au moment où j'en ai besoin, la valeur de FCT_COUNT pour l'id (je parcours les objets de ma table A dans une boucle dans l'appli). Seulement, j'ai pas mal de données et ça ralenti donc beaucoup le traitement. Je me suis dit que si une seule requête (par procédure stockée) me donnait directement toutes les informations plutôt que de le refaire à chaque fois ça serait plus rapide. Ai-je raison de me dire ça ?
    Je suis pas une experte en base de données et j'ai pas vraiment eu l'occasion de me pencher sur les procédures stockées et les fonctions avant ça, donc je ne sais pas bien ce qui est mieux et ce qui est moins bien, si tu as des conseils surtout n'hésites pas

    Merci encore !
    Dernière modification par Invité ; 24/12/2007 à 16h03.

  4. #4
    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,

    Pas de problèmes, on est tous là pour apprendre, moi j'ai commencé sous SQL Server en n'en connaissant rien

    L'intérêt des fonctions définies par les utilisateurs est que tu peux les utiliser directement dans une requête SELECT et qu'elles sont déterministes.
    Tu auras donc bien pour chaque ligne de ton jeu de données résultat la valeur que tu aurais si tu passais en paramètre à la fonction FCT_COUNT chaque valeur de la colonne B.id

    Exemple : ma fonction FCT_SQRT me retourne la racine carrée d'un nombre.
    J'ai une table LISTE dont les données sont:

    ID AMOUNT
    1 1
    2 4
    3 81
    4 49

    Si j'écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT ID, FCT_SQRT(AMOUNT) RACINE
    FROM LISTE
    Je vais obtenir:

    ID RACINE
    1 1
    2 2
    3 9
    4 7

    J'espère que c'est plus clair comme ça

    Bonnes fêtes

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Ok, il me semble que c'est bien ce que j'avais compris !
    Mais ce n'est pas ce qu'il me faut ^^ Si j'ai, mettons, les deux tables suivantes :

    A
    ID Name
    1 toto
    2 titi
    3 tutu

    B
    ID
    1
    2

    Il me faudrait comme résultat :

    ID Name count_1 count_2
    1 toto FCT_COUNT(1, 1) FCT_COUNT1, (2)
    2 titi FCT_COUNT(2, 1) FCT_COUNT(2, 2)
    3 tutu FCT_COUNT(3, 1) FCT_COUNT(3, 2)

    En écrivant, je me rends compte que j'ai raconté n'importe quoi, ma fonction FCT_COUNT a en fait 2 paramètres : un id de la table A et un id de la table B, désolée

    Pour l'instant, j'ai trouvé une solution en faisant cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select @b_select = @b_select + ',' + 'FCT_COUNT(A.id, ' + CAST(id as VARCHAR(100)) + ') as count_' + CAST(id as VARCHAR(100)) + ' from B order by id'
    que j'ajoute ensuite dans ma requête pour récupérer les données de la table A comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    set @vSelect = 'select A.id, A.name' + @b_select + ' from A'
    EXEC(@vSelect)
    Est-ce que ce sera effectivement plus rapide que si je faisais une requête de sélection sur A appelant ma fonction FCT_COUNT pour chaque entrée de B ? (en donnant à ma procédure stockée l'id de B que je traite)

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    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 : 22 010
    Billets dans le blog
    6
    Par défaut
    Ce que vous voulez faire c'est un CROSS JOIN suivi d'un PIVOT. SQL N'est pas fait pour faire de la cosmétique (PIVOT).

    Pour le cross join :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT T1.ID, NAME, T2.ID
    FROM   A T1
           CROSS JOIN B T2
    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/ * * * * *

Discussions similaires

  1. Réponses: 6
    Dernier message: 04/07/2008, 08h25
  2. [SQL2005] [TSQL] Procédure stockée et paramètres
    Par Invité dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 13/12/2007, 13h53
  3. [SQL2005] soucis procédures stockées
    Par f_bobo dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 27/09/2006, 11h13
  4. [SQL2005][TSQL] Procédure Stockée
    Par Cape31 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 03/08/2006, 09h58
  5. [SQl 2000] [TSQL] Procédures stockées dynamiques
    Par pihuete dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 17/05/2006, 09h25

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