2013-05-21 120 views
0

有没有办法让一个SELECT语句重复自己?
借此查询:像foreach循环重复选择语句

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

输出将

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

我想要做的就是重复这个SELECT语句对于每个不同的号码这样

-- 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

是的,Common Table Expressions可以递归。

下面是一个例子:http://blog.sqlauthority.com/2008/07/28/sql-server-simple-example-of-recursive-cte/

或者你可以使用一个while循环,啪的数字了你的字符串。

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)