2014-01-07 68 views
0

我所給出的數據不斷的格式如下:SQL拆分數據到新表

 
Items   Instrument 
-------  --------- 
1|2|3   201400001 
2|3   201400002 
3    201400003 
1|4   201400004 

,需要輸出:

 
Item   Instrument 
-------  --------- 
1    201400001 
2    201400001 
3    201400001 
2    201400002 
3    201400002 
3    201400003 
1    201400004 
4    201400004 

我的回答是存儲函數或我知道的程序,但哪些?此外,我是否編寫函數或過程來接受來自任何數據庫的列,我已經或將要根據具體情況編寫這些列?基本上這些是經常打開的報告,我被要求把它們放到sql中,這樣可以進一步分析數據。

我希望這是有道理的。預先感謝您的時間。

+0

你會想創建一個函數,而不是一個存儲過程來拆分它。 – UnhandledExcepSean

+0

我明白你主要是在尋找一種SQL方式;但是如果您有選擇使用SSIS,解決方案可能相當簡單和通用。 –

回答

2

試試這個:

DECLARE @MyTable TABLE (
    Items VARCHAR(8000) NOT NULL, 
    Instrument INT 
); 

INSERT @MyTable (Items, Instrument) 
SELECT '1|2|3', 201400001 UNION ALL 
SELECT '2|3', 201400002 UNION ALL 
SELECT '3', 201400003 UNION ALL 
SELECT '1|4', 201400004; 

SELECT z.XmlItem.value('(text())[1]', 'INT') AS Item, y.Instrument 
FROM (
    SELECT CONVERT(XML, N'<r>' + REPLACE(x.Items, N'|', N'</r> <r>') + N'</r>') AS ItemsAsXml, x.Instrument 
    FROM @MyTable x 
) y 
OUTER APPLY y.ItemsAsXml.nodes('r') z(XmlItem); 

基本上,將其轉換這樣1|2|3字符串轉換成XML這樣<r>1</r><r>2</r><r>3</r>。然後,nodes('r')方法允許讀取每個r元素。

0

如果你有所有可能的項目列表,然後你可以這樣做:

select i.itemId, t.instrument 
from table t join 
    items i 
    on '|' + t.items + '|' like '%|'+cast(i.itemId as varchar(255))+'|%'; 
0

原始代碼:http://dotnetbites.com/split-strings-into-table

修改爲您的情況:

CREATE FUNCTION [dbo].[SplitStringToTable] 
(
    @InputString VARCHAR(MAX) = '' 
    , @Delimiter CHAR(1) = ',' 
    , @Instrument char(8) 
) 
RETURNS @RESULT TABLE(ID INT IDENTITY, Items VARCHAR(1000), Instrument char(8)) 
AS 
BEGIN 
DECLARE @XML XML 
SELECT @XML = CONVERT(XML, SQL_TEXT) 
FROM ( 
    SELECT '<root><item>' 
     + REPLACE(@InputString, @Delimiter, '</item><item>') 
     + '</item></root>' AS SQL_TEXT 
    ) dt 

INSERT INTO @RESULT(Items, Instrument) 
SELECT t.col.query('.').value('.', 'VARCHAR(1000)') AS Items , @Instrument As Instrument 
FROM @XML.nodes('root/item') t(col) 
RETURN 

END