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 24/03/2011, 17h02   #1
Invité de passage
 
Homme
Étudiant
Inscription : novembre 2008
Messages : 15
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2008
Messages : 15
Points : 2
Points : 2
Par défaut Variable dynamique évaluable dans une procédure stockée

Bonjour à tous.
N'ayant pas trouvé réponse à ma question je me décide de poster ici.

J'ai réalisé une procédure stockée pour importer des valeurs issues d'automates.

Je cherche à boucler sur les valeurs (30 environ).
En ce sens je souhaite créer une variable dynamique évaluable comme on peut le faire en PHP.

Petit exemple PHP
<?php
$valeur1 = 10;
$compteur = 1;
echo ${'valeur'.$compteur}; //Affiche 10
?>

Voici une partie de ma procédure stockée
WHILE @Compteur <= @EvenementNbValeurs
BEGIN
INSERT INTO Valeur(EvenementId, MachineId, MessageId, DetailId, Valeur)
VALUES (@EvenementId, @MachineId, @MessageId, @Compteur, VariableDynamique);

SET @Compteur = @Compteur + 1;
END

VariableDynamique = @('Valeur'+@Compteur)


Je vous remercie de votre aide.
fifrelin70 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/03/2011, 17h14   #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

Vous n'avez surement pas besoin de boucle pour faire ça...

D'ou viennent vos données ?

pouvez vous mettre la procédure stockée en entier ?
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/03/2011, 17h48   #3
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Pouvez vous poster l'intégralité de votre procédure?vous pouvez surement en effet vous passer de boucle...
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/03/2011, 10h12   #4
Invité de passage
 
Homme
Étudiant
Inscription : novembre 2008
Messages : 15
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2008
Messages : 15
Points : 2
Points : 2
Par défaut Contexte

Alors,
j'ai une table IMPORT de transition qui va me permettre d'importer les événements des automates.
Un automate enregistre au maximum 30 valeurs.

Voici la table IMPORT que me donne les automaticiens :

EvenementId
MachineId
MessageId
EvenementPhase
EvenementNbValeurs
EvenementDate
EvemenentCommentaire
Valeur1
Valeur2
Valeur3
Valeur4
...
Valeur30


A partir de cette table j'ai crée un job qui va appeler mes procédures stockées toutes les heures pour importer ces données.
La première procédure importe les événements sans les valeurs
La seconde s'occupe d'insérer les valeurs.

Première procédure stockée "sp_import_evenement":
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
ALTER PROCEDURE [dbo].[sp_import_evenement]
	-- Add the parameters for the stored procedure here
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;
	
	-- Marqueur pour les événements importés
	DECLARE @MaxEvent int;
	SELECT @MaxEvent = MAX(i.EvenementId) FROM import i;
	
	-- Insertion Import vers Evenement
	INSERT Evenement(EvenementId, EvenementDate, EvenementPhase, EvenementCommentaire, MachineId, MessageId)
	SELECT i.EvenementId, i.EvenementDate, i.EvenementPhase, i.EvemenentCommentaire, i.MachineId, i.MessageId  
	FROM Import i;
	
	-- Appel de la procédure stockée sp_import_val
	EXEC sp_import_valeur
	
	-- Suppression des événements importés
        -- DELETE FROM Import WHERE EvenementId <= @MaxEvent
END
Seconde procédure stockée sp_import_valeur
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
ALTER PROCEDURE [dbo].[sp_import_valeur]
	-- Add the parameters for the stored procedure here

AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

	-- Déclarations des variables
	DECLARE 
	@Compteur INT = 1,
	@EvenementId INT,
	@MachineId INT,
	@MessageId INT,
	@EvenementNbValeurs INT,
	@Valeur1 REAL, @Valeur2 REAL, @Valeur3 REAL,
	@Valeur4 REAL, @Valeur5 REAL, @Valeur6 REAL,
	@Valeur7 REAL, @Valeur8 REAL, @Valeur9 REAL,
	@Valeur10 REAL, @Valeur11 REAL,	@Valeur12 REAL,
	@Valeur13 REAL, @Valeur14 REAL, @Valeur15 REAL,
	@Valeur16 REAL,	@Valeur17 REAL, @Valeur18 REAL,
	@Valeur19 REAL,	@Valeur20 REAL,	@Valeur21 REAL,
	@Valeur22 REAL,	@Valeur23 REAL,	@Valeur24 REAL,
	@Valeur25 REAL, @Valeur26 REAL, @Valeur27 REAL,
	@Valeur28 REAL, @Valeur29 REAL,	@Valeur30 REAL;
	
	DECLARE curseur CURSOR FOR(
		SELECT i.EvenementId, i.MachineId, i.MessageId, i.EvenementNbValeurs,
		i.Valeur1, i.Valeur2, i.Valeur3, i.Valeur4, i.Valeur5, i.Valeur6,
		i.Valeur7, i.Valeur8, i.Valeur9, i.Valeur10, i.Valeur11, i.Valeur12,
		i.Valeur13, i.Valeur14, i.Valeur15, i.Valeur16, i.Valeur17, i.Valeur18,
		i.Valeur19, i.Valeur20, i.Valeur21, i.Valeur22, i.Valeur23, i.Valeur24,
		i.Valeur25, i.Valeur26, i.Valeur27, i.Valeur28, i.Valeur29, i.Valeur30
		FROM Import i 
		WHERE i.EvenementNbValeurs > 0
	);
	
	OPEN curseur;
	FETCH curseur INTO @EvenementId, @MachineId, @MessageId, @EvenementNbValeurs,
	@Valeur1, @Valeur2, @Valeur3, @Valeur4, @Valeur5, @Valeur6,
	@Valeur7, @Valeur8, @Valeur9, @Valeur10, @Valeur11, @Valeur12,
	@Valeur13, @Valeur14, @Valeur15, @Valeur16, @Valeur17, @Valeur18,
	@Valeur19, @Valeur20, @Valeur21, @Valeur22, @Valeur23, @Valeur24,
	@Valeur25, @Valeur26, @Valeur27, @Valeur28, @Valeur29, @Valeur30;
	
	WHILE @@FETCH_STATUS = 0
	BEGIN
		
		WHILE @Compteur <= @EvenementNbValeurs 
		BEGIN 
			
			INSERT INTO Valeur(EvenementId, MachineId, MessageId, DetailId, Valeur)
			VALUES (@EvenementId, @MachineId, @MessageId, @Compteur, VariableDYNAMIQUE (@('Valeur'+@Compteur)));

			SET @Compteur = @Compteur + 1;
		END	

		FETCH curseur INTO @EvenementId, @MachineId, @MessageId, @EvenementNbValeurs,
		@Valeur1, @Valeur2, @Valeur3, @Valeur4, @Valeur5, @Valeur6,
		@Valeur7, @Valeur8, @Valeur9, @Valeur10, @Valeur11, @Valeur12,
		@Valeur13, @Valeur14, @Valeur15, @Valeur16, @Valeur17, @Valeur18,
		@Valeur19, @Valeur20, @Valeur21, @Valeur22, @Valeur23, @Valeur24,
		@Valeur25, @Valeur26, @Valeur27, @Valeur28, @Valeur29, @Valeur30;
	END
	
	CLOSE curseur;
	DEALLOCATE curseur;
	
END

Je vous joints également la modélisation.
Je vous remercie
Images attachées
Type de fichier : png analyse.png (29,3 Ko, 6 affichages)
fifrelin70 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/03/2011, 10h32   #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
Bonjour

Je n'ai pas lu en détail les deux procédures, mais pourquoi faire en deux étapes ?

Je confirme que vous pouvez vous passer de boucle, utilisez plutôt PIVOT

Quelle est votre version de SQL Server ?
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/03/2011, 10h34   #6
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
mais pourquoi faire en deux étapes
Il historise sa table d'import dans la première c'est tout je crois.

A priori c'est même UNPIVOT que vous devez utiliser qui vous permet de remettre vos 30 colonnes en lignes....

Le code suivant (à affiner en excluant les NULL par exemple) devrait faire votre bonheur:

Code :
1
2
3
4
5
6
7
8
SELECT EvenementId,MachineId,MessageId, VALUE, Orders
FROM 
   (SELECT EvenementId,MachineId,MessageId, Valeur1, Valeur2, Valeur3, Valeur4, Valeur5...
   FROM Import) p
UNPIVOT
   (Orders FOR VALUE IN 
      (Valeur1, Valeur2, Valeur3, Valeur4, Valeur5...)
)AS unpvt;
Vous avez maintenant une table parfaitement classique et exploitable pour une insertion massive.

Il faut avouer que les automaticiens ne vous on pas facilité la tache...
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/03/2011, 11h06   #7
Invité de passage
 
Homme
Étudiant
Inscription : novembre 2008
Messages : 15
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2008
Messages : 15
Points : 2
Points : 2
Merci, c'est parfaitement ce dont j'avais besoin.
Je ne connaissais pas PIVOT et UNPIVOT.

fifrelin70 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 22h59.


 
 
 
 
Partenaires

Hébergement Web