Bonjour,

Nous avons développé pour ma société un module de calcul de moyenne dans le domaine de la génétique. Il s'agit tout simplement d'effectuer des comparaisons de valeurs pour des individus A et B et d'extraire des résultats du type moyenne, nombre de valeurs identiques ...

Cependant nous nous sommes rendu compte que générer ces résultats sur le poste client de manière instantanée est trop long au niveau des temps d'exécution, car un individus A peut-être comparé a 2000 ou 3000 individus et chaque individus possède 500 à 1000 valeurs.

Nous avons donc décidé de mettre en place une procédure qui permet d'effectuer tous les traitements nécessaires chaque jour et d'alimenter une table pour ensuite faciliter l'extraction des données par le client avec une simple requête sur la table.

J'en viens à l'essentiel et à mes questions :

Dois-je obligatoirement en T-SQL utiliser les curseurs pour parcourir les enregistrements ?

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
36
37
38
39
 
DECLARE @MARQUEUR_1 varchar(20), @VALEUR_1 varchar(20), @MARQUEUR_2 varchar(20), @VALEUR_2 varchar(20) 
 
DECLARE CURSOR_FOR_1 CURSOR FOR
SELECT TOP(20) LAB_ANALYSE.MARQUEUR,LAB_ANALYSE.VALEUR
	FROM LAB_ANALYSE 
		WHERE CODE_FICHE IN 
			(SELECT DISTINCT(LAB_FICHE.CODE_FICHE)
				FROM LAB_FICHE
					WHERE LAB_FICHE.CODE_EXP = 'LSH369'
						AND LAB_FICHE.LOT = '')
OPEN CURSOR_FOR_1
FETCH NEXT FROM CURSOR_FOR_1 INTO @MARQUEUR_1, @VALEUR_1
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM CURSOR_FOR_1
 
	DECLARE CURSOR_FOR_2 CURSOR FOR
	SELECT TOP(20) LAB_ANALYSE.MARQUEUR,LAB_ANALYSE.VALEUR
	FROM LAB_ANALYSE 
		WHERE CODE_FICHE IN 
			(SELECT DISTINCT(LAB_FICHE.CODE_FICHE)
				FROM LAB_FICHE
					WHERE LAB_FICHE.CODE_EXP = 'LSH369'
						AND LAB_FICHE.LOT = '') AND LAB_ANALYSE.MARQUEUR = @MARQUEUR_1
 
	OPEN CURSOR_FOR_2
	FETCH NEXT FROM CURSOR_FOR_2 INTO @MARQUEUR_2, @VALEUR_2
	WHILE @@FETCH_STATUS = 0
	BEGIN
	FETCH NEXT FROM CURSOR_FOR_2
		PRINT 'TEST : ' + @VALEUR_2
	END
	CLOSE CURSOR_FOR_2
	DEALLOCATE CURSOR_FOR_2
 
END
CLOSE CURSOR_FOR_1
DEALLOCATE CURSOR_FOR_1