How to use multiple cursors to loop through tables in stored procedure

Posted on 2007-11-20
Last Modified: 2010-04-28
There is probably a very simple solution, but I just can't figure it out.

I've got 3 tables I am trying to query:  

Table 1 has flat data
Table 2 has 8-10 records for each value in table 1
Table 3 has record for each table1/table2 value combination

I need to know the proper syntax for looping through the values of table 2 for each value of table 1.  My select query works fine.  The current stored proc I'm using is working per se, but it's not producing the correct results since its not looping correctly.

Does anyone have any examples of using multiple cursors to loop through table values?  Any direction you can give would be appreciated.

Question by:squirleegirl
  • 2
LVL 18

Accepted Solution

JR2003 earned 50 total points
ID: 20321996
You should really just use one cursor on a query with joins to all the tables as this is more efficient:


  FROM Table1 T1

  LEFT JOIN Table2 T2

         ON T1.Table1Id = T2.Table1Id 

  LEFT JOIN Table3 T3

         ON T2.Table2Id = T3.Table2Id 

 ORDER BY T1.Table1Id, T2.Table2Id, T3.Table3Id

Open in new window


Author Comment

ID: 20322037
Thanks JR2003, fortunately, the SELECT query works really well.

The 2 cursor values are simply plugged into the where clause and it runs well and it runs well alone without the where.  I'm just trying to figure an easy way to automate this query so it can be called by an onclick() thus the need for the stored proc.

Author Comment

ID: 20322227
Actually, I just figured out a way to do this....Thanks JR2003 for responding so quickly
LVL 25

Expert Comment

ID: 20322341
fyi, for future reference
/* sample data

create table table1 ( a1 int, b1 int )

insert into table1 select 1,2

insert into table1 select 2,3

insert into table1 select 4,5

create table table2 ( a2 int, b2 int )

insert into table2 select 1,13

insert into table2 select 1,14

insert into table2 select 1,15

insert into table2 select 4,20 */

declare @a1 int, @b1 int -- for table fields

declare @a2 int, @b2 int -- for table fields

declare c1 cursor for

 select a1,b1 from table1

open c1

fetch next from c1 into @a1, @b1

while @@fetch_status = 0 begin

 declare c2 cursor for

  select a2, b2 from table2 where a2=@a1

 open c2

 fetch next from c2 into @a2, @b2

 while @@fetch_status = 0 begin

  select 'Table1 (a/b):', @a1, @b1, 'Table2 (a/b):', @a2, @b2

  fetch next from c2 into @a2, @b2


 close c2

 deallocate c2

 fetch next from c1 into @a1, @b1


close c1

deallocate c1

Open in new window


Featured Post

Get up to 2TB FREE CLOUD per backup license!

An exclusive Black Friday offer just for Expert Exchange audience! Buy any of our top-rated backup solutions & get up to 2TB free cloud per system! Perform local & cloud backup in the same step, and restore instantly—anytime, anywhere. Grab this deal now before it disappears!

Join & Write a Comment

Introduction SQL Server Integration Services can read XML files, that’s known by every BI developer.  (If you didn’t, don’t worry, I’m aiming this article at newcomers as well.) But how far can you go?  When does the XML Source component become …
Load balancing is the method of dividing the total amount of work performed by one computer between two or more computers. Its aim is to get more work done in the same amount of time, ensuring that all the users get served faster.
This videos aims to give the viewer a basic demonstration of how a user can query current session information by using the SYS_CONTEXT function
Viewers will learn how the fundamental information of how to create a table.

707 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

16 Experts available now in Live!

Get 1:1 Help Now