Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

T-SQL: Looping through an array of known values

Here's my scenario:

Let's say I have a stored procedure in which I need to call another stored procedure on a set of specific ids; is there a way to do this?

i.e. instead of needing to do this:

exec p_MyInnerProcedure 4 exec p_MyInnerProcedure 7 exec p_MyInnerProcedure 12 exec p_MyInnerProcedure 22 exec p_MyInnerProcedure 19 

Doing something like this:

*magic where I specify my list contains 4,7,12,22,19*  DECLARE my_cursor CURSOR FAST_FORWARD FOR *magic select*  OPEN my_cursor  FETCH NEXT FROM my_cursor INTO @MyId WHILE @@FETCH_STATUS = 0 BEGIN  exec p_MyInnerProcedure @MyId  FETCH NEXT FROM my_cursor INTO @MyId END 

My Main goal here is simply maintainability (easy to remove/add id's as the business changes), being able to list out all Id's on a single line... Performance shouldn't be as big of an issue

like image 569
John Avatar asked Oct 19 '09 15:10

John


People also ask

Can we pass array in SQL?

Basically you can't - SQL Server has no array type - ANSI SQL 92 does not specify array support. You could simulate an array by passing one or more varchar(255) fields with comma-separated values and then use a WHILE loop with PATINDEX and SUBSTR to extract the values.

How do you loop a stored procedure in SQL?

SQL While loop syntaxThe while loop in SQL begins with the WHILE keyword followed by the condition which returns a Boolean value i.e. True or False. The body of the while loop keeps executing unless the condition returns false. The body of a while loop in SQL starts with a BEGIN block and ends with an END block.


1 Answers

declare @ids table(idx int identity(1,1), id int)  insert into @ids (id)     select 4 union     select 7 union     select 12 union     select 22 union     select 19  declare @i int declare @cnt int  select @i = min(idx) - 1, @cnt = max(idx) from @ids  while @i < @cnt begin      select @i = @i + 1       declare @id = select id from @ids where idx = @i       exec p_MyInnerProcedure @id end 
like image 111
Adam Robinson Avatar answered Oct 12 '22 23:10

Adam Robinson