SQL将列中的数据拆分为新表

时间:2014-01-07 19:01:29

标签: sql tsql split ssms

我将按以下格式不断获得数据:

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中,以便可以进一步分析数据。

我希望这是有道理的。提前谢谢您的时间。

3 个答案:

答案 0 :(得分: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元素。

答案 1 :(得分:0)

如果您有所有可能项目的列表,那么您可以这样做:

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

答案 2 :(得分: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