我将按以下格式不断获得数据:
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 :(得分: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