2017-09-18 11 views
-1

J'ai deux tables - une est appelée #final et a beaucoup de données client (composite de toutes les informations). colonnes douzaine - first_name, middle_name, last_name, address, attendees etc. J'ai aussi une deuxième tableMS SQL Loop dans une boucle

create table #diff_temp 
(
customer_no int, 
num_reception int, 
num_guests int, 
diff int 
) 

la façon dont la seconde table est remplie avec un numéro de client, réception totale et des billets invités et la différence entre diff = reception-guests

Qu'est-ce que Je dois faire est d'exécuter une boucle et insérer le nom, l'information d'adresse dans #final la quantité de fois que diff est par enregistrement.

Par exemple.

#diff_Temp Les données ressemblent à ceci.

customer_no num_reception num_guests diff 
1   5    1   4 
2   12    10   2 
3   3    1   2 
4   32    20   12 
5   12    10   2 
6   8    6   2 

Ce que je dois arriver est qu'il ya une boucle pour le client 1 la boucle passe 4 fois et les données sont saisies 4 fois dans #final. Pour le client 2, la boucle fonctionnera 2 fois, pour le client 4, elle fonctionnera 12 fois, et ainsi de suite.

Pour chaque client, la boucle exécute le nombre d'heures de la valeur dans la colonne diff. La boucle insère ensuite les données dans #final en fonction d'une requête SQL volumineuse.

Je n'arrive pas à comprendre comment faire un curseur ou une boucle ici.


Ceci est le script que j'ai - il fonctionne mais ne fait rien. Lorsque j'exécute le curseur interne seulement, il prend la quantité de lignes (6) et entre dans chaque rangée 6 fois. Pas ce que je veux.

nouveau script mise à jour:

DECLARE @Iteration INT = 1  -- Loop 
DECLARE @diff INT = 1   -- Cursor 
DECLARE @owner_customer_no INT -- Cursor 

BEGIN  
       DECLARE loop_cursor CURSOR FOR 
       SELECT owner_customer_no, diff 
       FROM #diff_temp 

       OPEN loop_cursor 
       FETCH NEXT FROM loop_cursor INTO @owner_customer_no, @diff 

       WHILE @@FETCH_STATUS = 0 
       BEGIN 

       SET @Iteration = 1 
       WHILE @Iteration <= @diff 
       BEGIN  
         insert into #final 
         select distinct 
         e.customer_no,       

         0 as guest_cust_no,     
         h.fname, 
         ... 
         where e.campaign_no = 1119 
         and sc.coding_scenario = 2 

       PRINT @Iteration 
       PRINT @diff 
       PRINT @owner_customer_no 

       SET @Iteration = @Iteration + 1 
       END 

       FETCH NEXT FROM loop_cursor INTO @owner_customer_no, @diff 
       END 

       CLOSE loop_cursor 
       DEALLOCATE loop_cursor 
END 

Ce code génère les éléments suivants

(6 row(s) affected) 
iteration 1 
diff 4 
customer 1 

(6 row(s) affected) 
iteration 2 
diff 4 
customer 1 

(6 row(s) affected) 
iteration 3 
diff 4 
customer 1 

(6 row(s) affected) 
iteration 4 
diff 4 
customer 1 

(6 row(s) affected) 
iteration 1 
diff 2 
customer 2 

(6 row(s) affected) 
iteration 2 
diff 2 
customer 2 

Chaque itération/boucle est d'insérer 6 lignes - ce que je veux faire est d'insérer une ligne.

+2

Pourquoi pensez-vous que vous ne pouvez pas comprendre? Quel code avez-vous essayé et quelle erreur avez-vous eu? –

+0

@ TabAlleman - j'ai essayé, quelques choses qui sont où je suis coincé. J'ai ajouté le code dans la question. – Elizabeth

+0

De ce qui est posté il n'y a pas besoin de boucle ici. Cela consiste simplement à insérer des données qui peuvent et doivent éviter les boucles. –

Répondre

0

Lorsque vous déclarez la variable @diff, sa valeur est NULL.

Ensuite, vous essayez immédiatement de l'utiliser dans la boucle:

DECLARE @diff INT, @owner_customer_no INT -- Cursor 

WHILE @Iteration <= @diff 

Mais depuis @Iteration est jamais « inférieur ou égal à » NULL, la boucle while n'exécute pas.

EDIT: En fait, vous devez déplacer cette boucle:

WHILE @Iteration <= @diff 
BEGIN 
... 
SET @Iteration = @Iteration + 1 

END 

INSIDE votre curseur, de sorte qu'il exécute pour chacune des lignes dans #diff_temp.

EDIT 2:

Après cette ligne,

FETCH NEXT FROM loop_cursor INTO @owner_customer_no, @diff 

Set @Iteration retour à 1, de sorte que la boucle interne s'exécute correctement pour la ligne suivante de #diff_temp.

+0

J'ai mis à jour le @diff pour commencer à 1 - la boucle fonctionne maintenant, mais encore inexactement. – Elizabeth

+0

Voir ma modification. Placez votre boucle externe dans le curseur et placez votre INSERT à l'intérieur de celui-ci. –

+0

J'ai fait le changement, son fonctionnement très longtemps. Je pense que j'ai frappé une sorte de boucle infinie. . ... Récupère le curseur, alors que fetch_status = 0, commence, alors que l'itération <= diff, insère .... set l'itération = l'itération + 1, puis récupère la valeur suivante. ... pourquoi court si longtemps. – Elizabeth