2016-04-27 64 views
1

所以我有一個下表:選擇拆分值

id (int) | val (varchar) 
------------------------------------ 
1   | 4234,15345,1324,1534,1512 
2   | 215,22867,2456,24756,2423 
3   | 3123,3452,3356,3478,3995 

另外,我有一個功能fnSplitString(字符串VARCHAR(最大值),deliminator CHAR(1)),它的工作原理是這樣的:

SELECT * FROM fnSplitString ((SELECT val FROM idval WHERE id = 1),',') 

產生輸出:

val (varchar) 
------------ 
    4234 
    15345 
    1324 
    1534 
    1512 

我的目標是產生一個像這樣的表:

id (int) val (varchar) 
    ------------ 
1  4234 
1  15345 
1  1324 
1  1534 
1  1512 
2  215 
2  22867 
2  2456 
... 

我知道如何使用遊標實現它並插入臨時表。我只是好奇,如果這可以沒有光標,但呢?假設我不想首先修改fnSplitString函數。到目前爲止,我已經拿出查詢的一部分:

SELECT id, spl.val 
FROM idval JOIN 
(SELECT * FROM fnSplitString ((SELECT val FROM idval WHERE id = 1),',')) spl 
ON 1=1 
WHERE id = 1 

這給我留下了結果表僅適用於ID行數= 1

+4

不要像逗號分隔的項目(在一列中)存儲數據,它只會導致很多問題。規範化!一個值/行是SQL方式! – jarlh

+0

是的,從我們的客戶導入數據時沒有選擇。感謝您的建議無論如何;] – PacoDePaco

+0

我知道你的意思,必須清理其他人...... – jarlh

回答

3

你必須使用CROSS APPLY

SELECT * 
FROM idval i 
CROSS APPLY dbo.fnSplitString(i.val, ',') f 
+1

我知道它會很簡單,但沒有那麼多;]我只需要在這裏擺脫重複的val列。謝謝! – PacoDePaco