Déclaration de variables dans une boucle
Je continue toujours mon travail de refonte de l'ancienne application et je me demande à présent si l'algorithme ne souffre pas de lourdeurs dans sa programmation.
Tout d'abord je m'interroge quant aux déclarations de variables à l'intérieur de boucle While, ce procédé n'est-il pas trop gourmand en ressources processeur et mémoire ? Dans le code ci-dessous vous pouvez constater que les variables sont initialisées dans la boucle while, ma question est : est-il préférable de conserver l'organisation actuelle ou au contraire dois-je externaliser les déclarations ?
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
| -- Variable contenant au format unicode, l'identifiant de la table enregistrement
DECLARE @k nvarchar(50)
SELECT @idMaxCorresp = MAX(id_correspondance) -- finparcour
FROM dbo.correspondance
SELECT @idMaxEnreg = MAX(id_enr) -- finparcourenr
FROM dbo.enregistrement
SELECT @idMinEnreg = MIN(id_enr)
FROM enregistrement
SELECT @nomTab = nomtableau -- nom_tab
FROM tableau
WHERE (id_tableau = @id_tab)
-- Le N permet de spécifier que la chaîne subséquente est codée en Unicode
-- OUTPUT indique que la variable est un paramètre de sortie
SET @Para = N' @RESU nvarchar(4000) OUTPUT'
SET @presu = ''
SET @pTableName = @nomTab
-- Boucle autant de fois qu'il y a d'enregistrements
WHILE @idMinEnreg <= @idMaxEnreg
BEGIN
-- Déclaration des variables pour les libellés de la nomenclature
DECLARE @libNiv1 nvarchar(200) -- lib1
DECLARE @libNiv2 nvarchar(200) -- lib2
DECLARE @libNiv3 nvarchar(200) -- lib3
DECLARE @anneeval1 nvarchar(50)
DECLARE @moisval1 nvarchar(50)
DECLARE @valeur1 nvarchar (50)
-- Variable contenant au format unicode, le plus petit identifiant de la table enregistrement
DECLARE @nIdEnreg nvarchar(50)
SET @nIdEnreg = convert(int, @idMinEnreg)
SET @pRESU = ''
SET @k = convert(int, @idCorresp) |
La variable @k est initialisée en dehors de la boucle contrairement à la variable @nIdEnreg, laquelle de ses deux déclarations vous paraît le plus évident ?
P.S : Je suis ouvert à toutes remarques constructives concernant mon code, merci.
Edité : Je continue mon apprentissage du T-SQL et je découvre peu à peu des erreurs dont le sens m'échappe. Précédemment je me suis interrogé sur la déclaration de la variable @RESU et je continue d'ignorer le principe de fonctionnement de T-SQL concernant la déclaration.
Concrètement le code suivant fonctionne correctement contrairement au second qui génère une erreur.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
-- Version qui fonctionne
SET @SQL = N'set @RESU = (SELECT '+ @nomdesignation + ' FROM dbo.enregistrement WHERE id_enr=' + @nIdEnreg +') '
exec sp_executesql @SQL, @PARA
-- Version incorrecte
SET @RESU = (SELECT '+ @nomdesignation + ' FROM dbo.enregistrement WHERE id_enr=' + @nIdEnreg +')
SET @SQL = N'@RESU'
exec sp_executesql @SQL, @PARA
-- erreur générée
Msg*137, Niveau*15, État*1, Ligne*95
La variable scalaire "@RESU" doit être déclarée. |
Dans les deux cas, la variable @RESU n'est jamais déclarée (pas d'instruction DECLARE), pourquoi seule la deuxième version du code génère-t-elle une erreur ?