2012-09-04 47 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