2013-05-21 2 views
0

Есть ли способ сделать инструкцию SELECT повторяться?
Возьмите этот запрос:Повторить инструкцию select, как цикл foreach

DECLARE @one INT = 1 
SELECT @one + @one AS [MATH] 

Выходной сигнал будет

------ 
| MATH | 
------ 
| 2 | 
------ 

То, что я пытаюсь сделать, это повторить этот ЗЕЬЕСТ для каждого различных чисел, как это

-- PSEUDO CODE 

DECLARE @Numbers NVARCHAR(MAX) = '1,2,3,4' 
FOR EACH INT @number IN @Numbers 
BEGIN 

    SELECT @number + @number AS [MATH] 

END 

Выходной сигнал будет:

------  
| MATH | 
------ 
| 2 | 
------ 
------  
| MATH | 
------ 
| 4 | 
------ 
------  
| MATH | 
------ 
| 6 | 
------ 
------ 
| MATH | 
------ 
| 8 | 
------ 

Я знаю, что они не INT в то время, но у меня есть функция, которая разбивается на ',', а затем преобразует varchar в числа.

Я не знаю, как я мог бы поместить это в цикл WHILE, потому что не могу найти подходящее условие.

Есть ли способ сделать это?

+0

Ну, цель не выбирать каждый номер в отдельности, не так ли? Не могли бы вы объяснить, что вы на самом деле хотите сделать с результатами функции? –

ответ

2

Да, общие выражения таблицы могут рекурсивно.

Вот пример: http://blog.sqlauthority.com/2008/07/28/sql-server-simple-example-of-recursive-cte/

Или вы могли бы использовать время цикла, появляются цифры от вашей строки.

declare @sum = 0 
while len(@string) > 0 
begin 
     select @sum + convert(int, substring(1,charindex(',',@string),@string))) 
     select 'Math: '+ltrim(str(@sum)) 
     select @string = substring(charindex(',',@string),len(@string),@string) 
end 
+0

Ницца я попробую это спасибо – phadaphunk

+0

Этот код бросает ошибку. – AnandPhadke

2

попробовать это:

DECLARE @Numbers NVARCHAR(MAX) = '1,2,3,4' 
DECLARE @num int=0 
WHILE CHARINDEX(',',@Numbers) > 0 
BEGIN 
SET @num=convert(int,LEFT(@Numbers,1)) 
SET @Numbers=STUFF(REPLACE(@Numbers,LEFT(@Numbers,1),''),1,1,'') 
SELECT @num + @num AS [MATH] 
END 
select convert(int,@Numbers)+convert(int,@Numbers) 
Смежные вопросы