Procédure Stockée, requête modulaire
Utilisateur anonyme
-
Utilisateur anonyme -
Utilisateur anonyme -
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
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.
Merci d'avance
Seezer
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
-
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-
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) -
-
-
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
-