2014-01-07 19 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