Procédure Stockée, requête modulaire

Fermé
Utilisateur anonyme - 5 déc. 2013 à 09:40
 Utilisateur anonyme - 5 déc. 2013 à 11:08
Bonjour,

j'effectue actuellement une procédure stockée qui permet de récupérer des item* d'une table de ma base de donnée.

ma procédure stockée à donc 4 paramètres
1. last24 : passé à 1 si on veut les items seulement des dernières 24h
2. account_id : passé un int pour récupérer les items qui sont lié à ce dit compte
4. page / nbItem : passé page (page courante) et nbItem (nombre d'item par page) pour créer une pagination.

avant toute ma procédure stocké était constitué de IF. je devais donc créer une requête pour les items de ce compte les dernières 24h. les items de compte les dernière 24h avec pagination etc... ça devient assez vite surcharger.

je me suis mis dans l'idée exécuter qu'une seule requête et que celle-ci ce modifie suivant tel ou tel paramètre.

mes requêtes
-- Last 24h
SELECT * FROM table WHERE DATEDIFF(SECOND,champ_date,GETDATE()) <= (24*60*60)
-- via account_id
SELECT * FROM table WHERE account_id = @account_id
-- Paginate
SELECT top(@nbItem) * FROM table WHERE id
NOT IN( SELECT top(@page*@nbItem) id from table );


Ma question est donc la suivante il y a-t-il une astuce que vous utiliser pour créer vos requête de manière modulaire, car je dois vous l'avouez aucune des mes recherches jusqu'ici n'ont été fructueuse.

SELECT
IF @page IS NOT NULL
BEGIN
 TOP(@nbITEM)
END
WHERE
-- la suite


Merci d'avance

Seezer

1 réponse

Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
5 déc. 2013 à 09:59
Bonjour,

Pour la pagination, il faut que je regarde, mais je pense qu'on peut faire ça avec des row_number.

Pour les autres paramètres, tu peux essayer cette structure, qui permet facilement de rajouter des critères de filtre :
SELECT * FROM table WHERE
        (@account_id IS NULL OR account_id = @account_id)
    AND (@last24 = 0 OR DATEDIFF(SECOND,champ_date,GETDATE()) <= (24*60*60))


Xavier
0
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
5 déc. 2013 à 10:08
Alors pour compléter avec la pagination, j'ai une solution mais qui n'optimise pas vraiment côté perf (car toute la table est parcourue). Il y a sans doute mieux.
Cela donnerait :

SELECT * FROM
(
    SELECT *, ROW_NUMBER() OVER (ORDER BY champ_date) AS ligne
    FROM table WHERE
            (@account_id IS NULL OR account_id = @account_id)
        AND (@last24 = 0 OR DATEDIFF(SECOND,champ_date,GETDATE()) <= (24*60*60))
) t
WHERE
(@page IS NULL OR ligne BETWEEN @page * @nbItem AND @page * @nbItem + @nbItem - 1)
0
Utilisateur anonyme
5 déc. 2013 à 10:12
Merci pour cette première réponse, mon code à en effet passé de 50 lignes à 8.

Après si tu as encore ton astuce avec le row_number je suis preneur.

Mais merci pour ton aide.

P.S. tu m'as aussi fait découvrir que Reivax c'était Xavier à l'envers :0
0
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
5 déc. 2013 à 10:19
Nos messages se sont croisés, si tu n'as pas vu : la réponse avec row_number est donnée juste au-dessus (avec des bémols néanmoins)
0
Effectivement, j'ai pris connaissance de ta réponse. je pense que je vais l'appliquer dans un premier temps avec un gros.
-- Attention perf, trouver équivalent en plus performant
-- Si trouvé, compléter : http://www.commentcamarche.net/forum/affich-29240532-procedure-stockee-requete-modulaire#


comme ça je garderais un oeil sur le possible problème de performance.

je te remercie de tes réponses, ils m'ont été fortement utiles.

A+

Seezer
0