我想从使用两个不同文本分隔符的字符串返回整个表。行的分号,列的逗号。表值函数可以做到这一点,但我太绿了,无法理解如何解析然后将数据附加到预先存在的数据集。
我希望能够在数据集中容纳非固定数量的列,假设每行具有与其他行相同的列数。应该是数据在字符串中的顺序是列出来的顺序。希望这意味着将来对分隔的索引字符串有广泛的适用性。
示例(为清晰起见,添加了回车符 - 这是一个字符串):
Master Section 1,Stuff 1,234345,3453453,23423423;
Master Section 1,Stuff 2,6786787,6576576,76577;
Master Section 2,Section 2 Stuff 1,898676,9870970,8708798
变为:
Column 1 Column 2 Column 3 Column 4 Column 5
--------- -------- -------- -------- --------
Master Section 1 Stuff 1 234345 3453453 23423423
Master Section 1 Stuff 2 678678 6576576 76577
Master Section 2 Stuff 3 898676 9870970 8708798
理想情况下,拆分功能可以容纳与数据集中的逗号一样多的列。
当前拆分字符串功能:
ALTER FUNCTION [dbo].[splitstring] ( @stringToSplit VARCHAR(MAX), @delimiter VARCHAR(1))
RETURNS
@returnList TABLE ([item] [nvarchar] (500), rn int)
AS
BEGIN
DECLARE @item NVARCHAR(255)
DECLARE @pos INT
Declare @rn int = 1
WHILE CHARINDEX(@delimiter, @stringToSplit) > 0
BEGIN
SELECT @pos = CHARINDEX(@delimiter, @stringToSplit)
SELECT @item = SUBSTRING(@stringToSplit, 1, @pos-1)
INSERT INTO @returnList (item, rn)
SELECT @item, @rn
SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+1, LEN(@stringToSplit)-@pos)
SET @rn = @rn + 1
END
INSERT INTO @returnList (item, rn)
SELECT @stringToSplit, @rn
RETURN
END
我正在使用以下SQL查询调用SplitString
函数。这仅基于单个分隔符进行拆分,并且仅返回单个列。
INSERT INTO dbo.tblRepeaterStage0(Item_Title, Section_Values)
SELECT s.Item_Title, s.Section_Values
FROM
(
SELECT d.Item_Title, d.Raw_Repeater,
c.item Section_Values, c.rn
FROM dbo.tblRawRepeater d
CROSS APPLY dbo.splitstring(d.Raw_Repeater, ';') c
) s
同样,我希望调整此函数以接受两个分隔符,然后使用这些分隔符分割成行和列。然后需要将表值函数返回附加到预先存在的数据集。
答案 0 :(得分:0)
执行此操作的一种方法是XML
DECLARE @str VARCHAR(2000) = 'Master Section 1,Stuff 1,234345,3453453,23423423;
Master Section 1,Stuff 2,6786787,6576576,76577;
Master Section 2,Section 2 Stuff 1,898676,9870970,8708798'
DECLARE @strXML VARCHAR(8000) = '<table><row><col>' + REPLACE(REPLACE(@str,';','</col></row> <row><col>'),',','</col><col>') + '</col></row></table>'
DECLARE @XML XML = CAST(@strXML AS XML)
SELECT
line.col.value('col[1]', 'varchar(1000)') AS col1
,line.col.value('col[2]', 'varchar(1000)') AS col2
,line.col.value('col[3]', 'varchar(1000)') AS col3
,line.col.value('col[4]', 'varchar(1000)') AS col4
,line.col.value('col[5]', 'varchar(1000)') AS col5
FROM @XML.nodes('/table/row') AS line(col)