Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/12/2010, 14h50   #1
Invité de passage
 
Inscription : décembre 2010
Messages : 4
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 4
Points : 1
Points : 1
Par défaut Modification du jeu de résultats d'une procédure stockée

Bonjour à tous,

Je vous demande un peu d'aide car j'essaye de créer une procédure stockée qui, je pense, doit être simple mais là je bloque depuis hier. Je débute aussi en procédure stockée.

À partir d'une table, je dois retourner certains champs de la table, plus un calcul avec deux colonnes de la table. Je ne peux malheureusement pas faire juste un "SELECT".
J'ai pensé utiliser un curseur pour parcourir mon jeu de résultats (SELECT) et faire mes calculs mais à la fin de la procédure je n'obtiens qu'une ligne de résultats.

Voici un exemple de mon programme :
Code :
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
CREATE PROCEDURE [dbo].[CLIPS]
AS
Declare @NbframeIn  int         
Declare @NbframeOut int
Declare @id varchar(255)
Declare @creation varchar(255) 
Declare @Tcin varchar(255) 
Declare @TcOut varchar(255)
Declare @Duration varchar(255)
 
DECLARE curseur_clips CURSOR FOR
SELECT id, creation, TcIn, TcOut FROM clips
 
OPEN curseur_clips
FETCH curseur_clips INTO @id , @creation, @Tcin, @TcOut
 
WHILE @@FETCH_STATUS = 0
BEGIN
 
SET @NbframeIn = ((CONVERT(int, SUBSTRING(@Tcin, 1, 2)) * 3600) + (CONVERT(int, SUBSTRING(@Tcin, 4, 2)) * 60) + CONVERT(int, SUBSTRING(@Tcin, 7, 2))) * 24 + CONVERT(int, SUBSTRING(@Tcin, 10, 2)); 	
SET @NbframeOut = ((CONVERT(int, SUBSTRING(@TcOut, 1, 2)) * 3600) + (CONVERT(int, SUBSTRING(@TcOut, 4, 2)) * 60) + CONVERT(int, SUBSTRING(@TcOut, 7, 2))) * 24 + CONVERT(int, SUBSTRING(@TcOut, 10, 2)); 
 
SET @Duration = @NbframeOut - @NbframeIn
 
FETCH curseur_clips INTO @id , @creation, @Tcin, @TcOut
END
 
CLOSE curseur_clips
DEALLOCATE curseur_clips
En espérant que vous ayez compris ce que je voulais faire.

Merci.
chris2010 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2010, 17h05   #2
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour,

Je ne sais pas exactement ce que vous essayez de faire, mais visiblement, ca reste quelques calculs, et je ne vois pas ce qui vous empêche de faire cela en une requete SELECT, ca serait beaucoup plus simple et performant je pense...

d'autre part, avez vous mis tout votre procédure stockée, je ne vois pas ou elle renvoi les (le apparemment) résultat


a première vue, et en essayant de deviner votre besoin, je pense que cette requete devrait s'approcher de ce que vous voulez obtenir :
Code sql :
1
2
3
4
5
6
7
8
9
10
 
SELECT 
	id, 
	creation, 
	TcIn, 
	TcOut, 
	((CONVERT(int, SUBSTRING(Tcin, 1, 2)) * 3600) + (CONVERT(int, SUBSTRING(Tcin, 4, 2)) * 60) + CONVERT(int, SUBSTRING(Tcin, 7, 2))) * 24 + CONVERT(int, SUBSTRING(Tcin, 10, 2)) AS NbframeIn
	((CONVERT(int, SUBSTRING(TcOut, 1, 2)) * 3600) + (CONVERT(int, SUBSTRING(TcOut, 4, 2)) * 60) + CONVERT(int, SUBSTRING(TcOut, 7, 2))) * 24 + CONVERT(int, SUBSTRING(TcOut, 10, 2)) AS NbframeOut
	((CONVERT(int, SUBSTRING(Tcin, 1, 2)) * 3600) + (CONVERT(int, SUBSTRING(Tcin, 4, 2)) * 60) + CONVERT(int, SUBSTRING(Tcin, 7, 2))) * 24 + CONVERT(int, SUBSTRING(Tcin, 10, 2)) - ((CONVERT(int, SUBSTRING(TcOut, 1, 2)) * 3600) + (CONVERT(int, SUBSTRING(TcOut, 4, 2)) * 60) + CONVERT(int, SUBSTRING(TcOut, 7, 2))) * 24 + CONVERT(int, SUBSTRING(TcOut, 10, 2)) AS Duration
FROM clips
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2010, 17h26   #3
Invité de passage
 
Inscription : décembre 2010
Messages : 4
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 4
Points : 1
Points : 1
Bonjour,

Merci pour votre réponse.
En effet, c'est juste du calcul mais je dois par la suite retourner la variable "duration" en chaine de caractère sous le format 'xx : xx : xx : xx'. Je pense que je ne peux pas le faire avec le "Select".
Mes variables NbframeIn et NbframeOut me permettent juste de transformer Tcin et TcOut en entier pour faire le calcul de la durée.

Je pensais qu'avec le curseur je pouvais modifier le jeu de resultats et le réafficher. Qu'est qu'il me manque à la fin de mon code?

J'avais mis les variables en output @id , @creation, @Tcin, @TcOut, @Duration mais avec le OutPut, çà me renvoie qu'un seul résultat.

Merci
chris2010 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2010, 18h25   #4
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Je m'etais trompé d'ailleur dans le calcul de Duration, je calculais l'inverse
revoici donc la bonne requete :


Code sql :
1
2
3
4
5
6
7
8
9
10
 
SELECT 
	id, 
	creation, 
	TcIn, 
	TcOut, 
	((CONVERT(int, SUBSTRING(Tcin, 1, 2)) * 3600) + (CONVERT(int, SUBSTRING(Tcin, 4, 2)) * 60) + CONVERT(int, SUBSTRING(Tcin, 7, 2))) * 24 + CONVERT(int, SUBSTRING(Tcin, 10, 2)) AS NbframeIn
	((CONVERT(int, SUBSTRING(TcOut, 1, 2)) * 3600) + (CONVERT(int, SUBSTRING(TcOut, 4, 2)) * 60) + CONVERT(int, SUBSTRING(TcOut, 7, 2))) * 24 + CONVERT(int, SUBSTRING(TcOut, 10, 2)) AS NbframeOut
 ((CONVERT(int, SUBSTRING(TcOut, 1, 2)) * 3600) + (CONVERT(int, SUBSTRING(TcOut, 4, 2)) * 60) + CONVERT(int, SUBSTRING(TcOut, 7, 2))) * 24 + CONVERT(int, SUBSTRING(TcOut, 10, 2)) - ((CONVERT(int, SUBSTRING(Tcin, 1, 2)) * 3600) + (CONVERT(int, SUBSTRING(Tcin, 4, 2)) * 60) + CONVERT(int, SUBSTRING(Tcin, 7, 2))) * 24 + CONVERT(int, SUBSTRING(Tcin, 10, 2)) AS Duration
FROM clips

pour ce qui est du formatage de Duration, vous pouvez créer une UDF qui le fait, mais le mieux si vous le pouvez, et encore de traiter ca dans le programme qui l'affiche, c'est plus son role que celui d'un SGBDR
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2010, 18h28   #5
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Si vous aviez mis les variables en OUTPUT, je comprend maintenant comment vous récupériez les résultats, je comprend aussi pourquoi vous n'aviez que les derniers : vous faite une boucle ou vous écrasez à chaque fois vos valeurs, et vous ne les récupérez qu'a la fin de la boucle, donc uniquement les dernières valeurs calculées !
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2010, 18h42   #6
Invité de passage
 
Inscription : décembre 2010
Messages : 4
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 4
Points : 1
Points : 1
Je suis obligé de faire le formatage dans la procédure stockée car ce n'est pas moi qui vais traiter le resultat de la procédure stockée et l'afficher.

Je vais aussi avoir des conditions sur le calcul de la durée.

La solution serait donc une UDF. Je laisse tomber le curseur.

Merci pour votre aide, je vais essayer de reprogrammer tout çà.
chris2010 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2010, 15h49   #7
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
re,

je ne sais pas quelles sont les valeurs qui vous intéressent vraiment au final, mais si vous ne voulez que la durée, vous pouvez même faire une udf qui prend TcIn et TcOut comme paramètres, et qui vous retourne la durée formatée comme vous le voulez; Votre requete sera plus lisible et votre fonction sera a priori déterministe, donc si vous avez plusieurs fois le même couple tcIn et TcOut, elle ne sera exécutée qu'une seule fois par couple.
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2010, 15h09   #8
Invité de passage
 
Inscription : décembre 2010
Messages : 4
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 4
Points : 1
Points : 1
Merci beaucoup pour votre aide, j'ai réussi à avoir mon resultat.
chris2010 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h45.


 
 
 
 
Partenaires

Hébergement Web