2012-09-04 20 views
0

让我们假设我有一个产品表像这样多个插入知道数量

product | number 
---------------------- 
aaaa  |  2 
bbbb  |  3 
cccc  |  1 
dddd  |  4 

这是一个稍微复杂一些,但这个想法是一样的。

我需要回到这样的事情

aaaa0001 
aaaa0002 
bbbb0003 
bbbb0004 
bbbb0005 
cccc0006 
dddd0007 
dddd0008 
dddd0009 
dddd0010 

我的意思是,每个产品在列中指定的次数,并在最后某种识别器的。

我该怎么做?

我想表变量,随着身份的标识

DECLARE @Codigos TABLE (ID INT IDENTITY(1,1), Barra Varchar(50) NOT NULL) 

和插入后,做

select rtrim(ltrim(barra)) + right('0000' + rtrim(ltrim(cast(id as varchar(10)))),4) from @Codigos 

但是这意味着我将不得不插入每个产品的数量在产品变量中的时间,如

@Codigos 
id  | Barra 
---------------- 
1  | aaaa 
2  | aaaa 

我正面临着问题。我怎样才能做到这一点 ?用光标?这就是我的想法,但我想知道是否有更好的选择。

最大将在原表300行。

回答

6

这应做到:

;WITH CTE AS 
(
    SELECT product, Number, 1 RN 
    FROM YourTable 
    UNION ALL 
    SELECT product, Number, RN + 1 
    FROM CTE 
    WHERE RN + 1 <= Number 
) 
SELECT product + RIGHT('000' + CAST(RN AS VARCHAR(3)),3) YourColumn 
FROM CTE 
ORDER BY product, Number 
OPTION(MAXRECURSION 0) 

Here is a sqlfiddle,您可以尝试。

+0

哇,这似乎是我想要的。让我试试看。我不知道Option有什么用。很好! –

+1

@ElVieejo - 'OPTION(MAXRECURSION N)'定义了CTE的递归级别。当N为零时,基本上意味着“尽可能多”:-) – Lamak