0

2 つの異なるテキスト区切り文字を使用する文字列からテーブル全体を返したいと思います。行はセミコロン、列はカンマ。テーブル値関数でこれを行うことができますが、データを解析して既存のデータセットに追加する方法を理解するにはあまりにも未熟です。

各行が他の行と同じ数の列を持っていると仮定して、データセット内の固定されていない数の列に対応できるようにしたいと考えています。データが文字列内にある順序は、列が出てくる順序である必要があります。願わくば、これが将来、区切られたインデックス付き文字列に幅広く適用できることを意味することを願っています。

例 (わかりやすくするためにキャリッジ リターンを追加 - これは単一の文字列です):

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

繰り返しますが、この関数を 2 つの区切り記号を受け入れるように適応させ、それらの区切り記号を使用して行と列に分割したいと考えています。次に、テーブル値関数の戻り値を既存のデータ セットに追加する必要があります。

4

1 に答える 1

0

これを行う 1 つの方法は 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 に答える