2017-09-18 5 views
0

J'ai une variable globale qui est incrémentée dans la boucle While Nested. Dans chaque itération, il réinitialise la valeur à 1 (c'est-à-dire, valeur initialement initialisée).SQL Server - Réinitialisation des variables globales dans une boucle While imbriquée

ressaisie-produit Code de mesure:

SET NOCOUNT ON; 
DECLARE @GlobalCounter INT = 1; 
DECLARE @CounterOne INT = 1; 
DECLARE @CounterTwo INT = 1; 

WHILE(@CounterOne <= 10) 
BEGIN 
    PRINT 'Outer Loop:'; 
    PRINT @GlobalCounter; 

    DECLARE @SerialInfo table 
    (
     [Id] [int] IDENTITY(1,1) NOT NULL, 
     [SNumber] [NVARCHAR](20) NOT NULL, 
     PRIMARY KEY ([Id]) 
    ); 

    SET @CounterTwo = 1; 
    WHILE(@CounterTwo <= 10) 
    BEGIN 

     DECLARE @SerialNumber NVARCHAR(20); 
     SET @SerialNumber = 'SRL: ' + CONVERT(NVARCHAR(10), @GlobalCounter); 

     INSERT INTO @SerialInfo([SNumber]) VALUES (@SerialNumber); 

     SET @GlobalCounter = @GlobalCounter + 1; 
     SET @CounterTwo = @CounterTwo + 1; 
    END 

    SET @CounterTwo = 1; 
    WHILE(@CounterTwo <= 10) 
    BEGIN 
     SET @SerialNumber = ''; 
     SELECT @SerialNumber = [SNumber] FROM @SerialInfo WHERE [Id] = @CounterTwo; 
     PRINT @SerialNumber; 
     SET @CounterTwo = @CounterTwo + 1; 
    END 

    SET @CounterOne = @CounterOne + 1; 
END 

me aider Veuillez en termes de portée variable globale et sa valeur. Comment atteindre les résultats escomptés

SRL: 1 
SRL: 2 
SRL: 3 
. 
. 
. 
SRL: 99 
SRL: 100 

Resultant Image

+0

Quels sont les résultats actuellement obtenus? –

+0

pas sûr de ce que le problème est quand je vérifie pour voir ce qui est dans les résultats sont @serialinfo je reçois les résultats attendus que vous avez posté. nous aurons besoin de savoir quels résultats vous obtenez. – ttallierchio

+0

@Jonathan J'ai ajouté une capture d'écran qui contient le résultat de la requête SQL ci-dessus. –

Répondre

1

En T-SQL, variable de clarifications font pas participent au flux de contrôle. Donc, juste parce que declare @SerialInfo table... apparaît à l'intérieur de la boucle, cela ne signifie pas que @SerialInfo est réinitialisé comme table vide à chaque fois à travers la boucle.

Dès qu'une déclaration de variable est rencontrée lors de l'analyse de chaque lot, le nom de la variable devient valide à partir de ce point jusqu'à la fin du lot.

E.g. cela fonctionne:

if 1=0 
begin 
    declare @a int 
end 
set @a = 15 
print @a 

Malheureusement, votre code actuel est si base que la procédure, il est difficile de voir ce que tâche réelle vous essayez d'accomplir et de faire une recommandation pour le fixer. Mais il ne nécessite probablement pas de boucles et il dépend des valeurs IDENTITY générées.


Si tout va bien, de ce qui précède, il est clair que vous voyez - @SerialInfo finit contenant 100 lignes avec toutes les valeurs que vous avez apparemment voulu. Mais puisque votre boucle print interroge uniquement les 10 premières lignes de la table, elle continue à produire les mêmes 10 lignes qui ont été insérées lors de la première exécution de la boucle externe.

0

La chose est avec cette requête que vous avez fourni, que vous interrogez seulement le premier 10 [SNumber]

WHILE(@CounterTwo <= 10) 
BEGIN 
    SET @SerialNumber = ''; 
    SELECT @SerialNumber = [SNumber] FROM @SerialInfo WHERE [Id] = @CounterTwo; 

Vérifiez cette requête si elle correspond à votre logique métier:

SET NOCOUNT ON; 
DECLARE @GlobalCounter = 1; 
DECLARE @CounterOne INT = 1; 
DECLARE @CounterTwo INT = 1; 

WHILE(@CounterOne <= 10) 
BEGIN 
    DECLARE @SerialInfo table 
    (
     [Id] [int] IDENTITY(1,1) NOT NULL, 
     [SNumber] [NVARCHAR](20) NOT NULL, 
     PRIMARY KEY ([Id]) 
    ); 

    SET @CounterTwo = 1; 
    WHILE(@CounterTwo <= 10) 
    BEGIN 

     DECLARE @SerialNumber NVARCHAR(20); 
     SET @SerialNumber = 'SRL: ' + cast(@globalCounter as varchar) 

     INSERT INTO @SerialInfo([SNumber]) VALUES (@SerialNumber); 
     SET @GlobalCounter = @GlobalCounter + 1; 
     SET @CounterTwo = @CounterTwo + 1; 
    END 
    SET @CounterOne = @CounterOne + 1; 
END 
set @CounterTwo = 1 
WHILE(@CounterTwo <= @GlobalCounter) 
BEGIN 
    SET @SerialNumber = ''; 
    SELECT @SerialNumber = [SNumber] FROM @SerialInfo WHERE [Id] = @CounterTwo; 
    PRINT @SerialNumber; 
    SET @CounterTwo = @CounterTwo + 1; 
END 
+0

Pas du tout. La variable de table '@SerialInfo' contient toujours 10 enregistrements. –