Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在sql server中动态多次拆分字符串并将其分为多个组_Sql_Sql Server 2008_Tsql - Fatal编程技术网

如何在sql server中动态多次拆分字符串并将其分为多个组

如何在sql server中动态多次拆分字符串并将其分为多个组,sql,sql-server-2008,tsql,Sql,Sql Server 2008,Tsql,我有一张如下表: ref_id 21121212122233333333 21222233333333333333 22112212333333333333 22213333333333333333 结果应该是这样的 ref_id `Group_1 ` `Group_2`Group_3`Group_4`Group_5` 21121212122233333333 2 112 12 12 1222 2122223333333

我有一张如下表:

ref_id

21121212122233333333
21222233333333333333
22112212333333333333
22213333333333333333
结果应该是这样的

ref_id            `Group_1  ` `Group_2`Group_3`Group_4`Group_5`

21121212122233333333    2      112      12      12      1222
21222233333333333333    2      12222            
22112212333333333333    22     1122     12      
12213333333333333333    122    1            
查询将获取数字1之前的字符串部分(例如2或22),并将字符串部分从1提取到1之前的下一部分(例如12222),但不包括3。我注意到可能有n个组

不知道怎么做。。。任何帮助都将不胜感激

DECLARE@ref表(RowID INT IDENTITY,ref_id NVARCHAR(20))
DECLARE @ref TABLE (RowID INT IDENTITY, ref_id NVARCHAR (20))
DECLARE @refunpivot TABLE (RowID INT, ColumnID INT, RefString NVARCHAR(20))
DECLARE @refpivot TABLE  (RowID INT IDENTITY
                         ,ref_id    NVARCHAR (20)
                         ,Group_01  NVARCHAR (20)
                         ,Group_02  NVARCHAR (20)
                         ,Group_03  NVARCHAR (20)
                         ,Group_04  NVARCHAR (20)
                         ,Group_05  NVARCHAR (20)
                         ,Group_06  NVARCHAR (20)
                         ,Group_07  NVARCHAR (20)
                         ,Group_08  NVARCHAR (20)
                         ,Group_09  NVARCHAR (20)
                         ,Group_10  NVARCHAR (20)
                         )

INSERT INTO @ref VALUES
        ('21121212122233333333'),
        ('21222233333333333333'),
        ('22112212333333333333'),
        ('22213333333333333333')


DECLARE @refstring NVARCHAR (20)
DECLARE @Counter1 INT = 0
DECLARE @Counter2 INT = 0
DECLARE @Marker INT

WHILE @Counter1 < (SELECT MAX(RowID) FROM @ref) BEGIN
    SET @Counter1 += 1
    SET @refstring = (SELECT ref_id FROM @ref WHERE RowID = @Counter1)
    SET @refstring = LEFT(@refstring,CHARINDEX('3',@refstring)-1)
    SET @Counter2 = 0
    WHILE CHARINDEX('1',@refstring) > 0 BEGIN
        SET @Counter2 += 1
        SET @Marker = CHARINDEX('1',RIGHT(@refstring,LEN(@refstring)-1))
        INSERT INTO @refunpivot SELECT @Counter1, @Counter2, LEFT(@refstring,@Marker)
        SET @refstring = RIGHT(@refstring,LEN(@refstring)-@Marker)
        IF CHARINDEX('1',RIGHT(@refstring,LEN(@refstring)-1)) = 0
            BEGIN
                SET @Counter2 += 1
                INSERT INTO @refunpivot SELECT @Counter1, @Counter2, @refstring
                SET @refstring = ''
            END

        END     

    END

SET @Counter1 = 0

    WHILE @Counter1 < (SELECT MAX(RowID) FROM @refunpivot) BEGIN
        SET @Counter1 += 1
        INSERT INTO @refpivot (ref_id) 
            SELECT ref_id FROM @ref WHERE RowID = @Counter1
        UPDATE @refpivot
            SET Group_01 = COALESCE((SELECT RefString FROM @refunpivot WHERE RowID = @Counter1 AND ColumnID = 1),'')
                WHERE RowID = @Counter1
        UPDATE @refpivot
            SET Group_02 = COALESCE((SELECT RefString FROM @refunpivot WHERE RowID = @Counter1 AND ColumnID = 2),'')
                WHERE RowID = @Counter1
        UPDATE @refpivot
            SET Group_03 = COALESCE((SELECT RefString FROM @refunpivot WHERE RowID = @Counter1 AND ColumnID = 3),'')
                WHERE RowID = @Counter1
        UPDATE @refpivot
            SET Group_04 = COALESCE((SELECT RefString FROM @refunpivot WHERE RowID = @Counter1 AND ColumnID = 4),'')
                WHERE RowID = @Counter1
        UPDATE @refpivot
            SET Group_05 = COALESCE((SELECT RefString FROM @refunpivot WHERE RowID = @Counter1 AND ColumnID = 5),'')
                WHERE RowID = @Counter1
        UPDATE @refpivot
            SET Group_06 = COALESCE((SELECT RefString FROM @refunpivot WHERE RowID = @Counter1 AND ColumnID = 6),'')
                WHERE RowID = @Counter1
        UPDATE @refpivot
            SET Group_07 = COALESCE((SELECT RefString FROM @refunpivot WHERE RowID = @Counter1 AND ColumnID = 7),'')
                WHERE RowID = @Counter1
        UPDATE @refpivot
            SET Group_08 = COALESCE((SELECT RefString FROM @refunpivot WHERE RowID = @Counter1 AND ColumnID = 8),'')
                WHERE RowID = @Counter1
        UPDATE @refpivot
            SET Group_09 = COALESCE((SELECT RefString FROM @refunpivot WHERE RowID = @Counter1 AND ColumnID = 9),'')
                WHERE RowID = @Counter1
        UPDATE @refpivot
            SET Group_10 = COALESCE((SELECT RefString FROM @refunpivot WHERE RowID = @Counter1 AND ColumnID = 10),'')
                WHERE RowID = @Counter1

        END

SELECT * FROM @refpivot
声明@refunpivot表(RowID INT、ColumnID INT、RefString NVARCHAR(20)) 声明@refpivot表(RowID INT-IDENTITY) ,参考编号NVARCHAR(20) ,第01组NVARCHAR(20) ,第02组NVARCHAR(20) ,第03组NVARCHAR(20) ,第04组NVARCHAR(20) ,第05组NVARCHAR(20) ,第06组NVARCHAR(20) ,第07组NVARCHAR(20) ,第08组NVARCHAR(20) ,第09组NVARCHAR(20) ,第10组NVARCHAR(20) ) 插入@ref值 ('21121212122233333333'), ('21222233333333333333'), ('22112212333333333333'), ('22213333333333333333') 声明@refstring NVARCHAR(20) 声明@Counter1 INT=0 声明@Counter2 INT=0 声明@Marker INT 当@Counter1<(从@ref中选择MAX(RowID)时,开始 设置@Counter1+=1 设置@refstring=(从@ref中选择ref\u id,其中RowID=@Counter1) 设置@refstring=LEFT(@refstring,CHARINDEX('3',@refstring)-1) 设置@Counter2=0 当CHARINDEX('1',@refstring)>0开始时 设置@Counter2+=1 设置@Marker=CHARINDEX('1',右(@refstring,LEN(@refstring)-1)) 插入到@refunpivot中,选择@Counter1、@Counter2、左(@refstring、@Marker) 设置@refstring=RIGHT(@refstring,LEN(@refstring)-@Marker) 如果CHARINDEX('1',RIGHT(@refstring,LEN(@refstring)-1))=0 开始 设置@Counter2+=1 插入@refunpivot选择@Counter1、@Counter2、@refstring 设置@refstring='' 结束 结束 结束 设置@Counter1=0 当@Counter1<(从@refunpivot选择MAX(RowID))开始时 设置@Counter1+=1 插入@refpivot(ref\u id) 从@ref中选择ref_id,其中RowID=@Counter1 更新@refpivot 设置组_01=COALESCE((从@refunpivot中选择RefString,其中RowID=@Counter1,ColumnID=1),“”) 其中RowID=@Counter1 更新@refpivot 设置组_02=COALESCE((从@refunpivot中选择RefString,其中RowID=@Counter1,ColumnID=2),“”) 其中RowID=@Counter1 更新@refpivot 设置组_03=COALESCE((从@refunpivot中选择RefString,其中RowID=@Counter1,ColumnID=3),“”) 其中RowID=@Counter1 更新@refpivot 设置组_04=COALESCE((从@refunpivot中选择RefString,其中RowID=@Counter1,ColumnID=4),“”) 其中RowID=@Counter1 更新@refpivot 设置组_05=合并((从@refunpivot中选择RefString,其中RowID=@Counter1,ColumnID=5),“”) 其中RowID=@Counter1 更新@refpivot 设置组_06=COALESCE((从@refunpivot中选择RefString,其中RowID=@Counter1,ColumnID=6),“”) 其中RowID=@Counter1 更新@refpivot 设置组_07=COALESCE((从@refunpivot中选择RefString,其中RowID=@Counter1,ColumnID=7),“”) 其中RowID=@Counter1 更新@refpivot 设置组_08=COALESCE((从@refunpivot中选择RefString,其中RowID=@Counter1,ColumnID=8),“”) 其中RowID=@Counter1 更新@refpivot 设置组_09=COALESCE((从@refunpivot中选择RefString,其中RowID=@Counter1,ColumnID=9),“”) 其中RowID=@Counter1 更新@refpivot 设置组_10=COALESCE((从@refunpivot中选择RefString,其中RowID=@Counter1,ColumnID=10),“”) 其中RowID=@Counter1 结束 从@refpivot中选择*
我不擅长透视表;这一点或许可以通过这些改进。我还为我的更新语句考虑了动态SQL,但我也不明白这一点。但这至少应该让你开始。还请记住,我无法使您的表值与您的说明完全一致,因此我做了对我最有意义的事情。从这里进行修改应该是相当基本的

以下是我得到的结果:

声明@ref表(RowID INT IDENTITY,ref_id NVARCHAR(20))
声明@refunpivot表(RowID INT、ColumnID INT、RefString NVARCHAR(20))
声明@refpivot表(RowID INT-IDENTITY)
,参考编号NVARCHAR(20)
,第01组NVARCHAR(20)
,第02组NVARCHAR(20)
,第03组NVARCHAR(20)
,第04组NVARCHAR(20)
,第05组NVARCHAR(20)
,第06组NVARCHAR(20)
,第07组NVARCHAR(20)
,第08组NVARCHAR(20)
,第09组NVARCHAR(20)
,第10组NVARCHAR(20)
)
插入@ref值
('21121212122233333333'),
('21222233333333333333'),
('22112212333333333333'),
('22213333333333333333')
声明@refstring NVARCHAR(20)
声明@Counter1 INT=0
声明@Counter2 INT=0
声明@Marker INT
当@Counter1<(从@ref中选择MAX(RowID)时,开始
设置@Counter1+=1
设置@refstring=(从
declare @t table (ref_id varchar(50)) insert into @t (ref_id) values
('21121212122233333333'),
('21222233333333333333'),
('22112212333333333333'),
('12213333333333333333')
declare @n varchar(max)

SELECT distinct ref_id

, S.a.value('(/t)[1]', 'VARCHAR(100)') AS Group_1 
, S.a.value('(/t)[2]', 'VARCHAR(100)') AS Group_2
, S.a.value('(/t)[3]', 'VARCHAR(100)') AS Group_3
, S.a.value('(/t)[4]', 'VARCHAR(100)') AS Group_4
, S.a.value('(/t)[5]', 'VARCHAR(100)') AS Group_5
FROM
(

select ref_id, cast('<t>'+replace(replace(ref_id,'3',''),'21','2</t><t>1') +'</t>' as xml) as [val]  from @t) d

CROSS APPLY d.[val].nodes('/t') S(a)