0

我想从使用两个不同文本分隔符的字符串中返回整个表。行用分号,列用逗号。表值函数可以做到这一点,但我太不了解如何解析然后将数据附加到预先存在的数据集中。

假设每一行的列数与其他行相同,我希望能够在数据集中容纳非固定数量的列。应该是数据在字符串中的顺序是列出来的顺序。希望这意味着将来对分隔的索引字符串具有广泛的适用性。

示例(为清楚起见添加了回车 - 这是一个字符串):

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

SplitString现在正在使用以下 SQL 查询调用该函数。这仅基于单个分隔符进行拆分,并且仅返回单个列。

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

同样,我希望调整此函数以接受两个分隔符,然后使用这些分隔符拆分为行和列。然后需要将表值函数返回附加到预先存在的数据集。

4

1 回答 1

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) 
于 2013-06-19T15:34:32.080 回答