使用分隔符拆分字符串,并在SQL中将每个部分设置为变量

时间:2015-03-20 15:58:06

标签: tsql stored-procedures split

我需要用这种格式拆分一些字符串:

V_9_0_2_2_70_0_0_3_B

分隔符是' _'。

我希望每个值都存储在我的变量

DECLARE   @w_grup1                char(1),

                             @w_grup2       char(1),

                             @w_grup3       varchar(10),

                             @w_grup4       char(1),

                             @w_grup5       char(1),

                             @w_grup6       varchar(10),

                             @w_grup7       char(1),               

                             @w_grup8       varchar(10),      

                             @w_grup9       char(1),               

                             @w_grup10     char(1)

我该怎么做?一些建议?

2 个答案:

答案 0 :(得分:1)

那么,这样的事情呢?

with split as
(
  select
    item = cast('' as varchar(max)),
    source = cast('V_9_0_2_2_70_0_0_3_B' as varchar(max))
  union all
  select
    item = substring(source, 1, charindex('_', source)),
    source = substring(source, charindex('_', source) + 1, 10000)
  from split
  where source > ''
)
select substring(item, 1, charindex('_', item) -1)
from split
where item > ''

来自this question

答案 1 :(得分:1)

我认为你最好的选择是递归CTE。注意:我没有将数据加载到表中,但我认为你可以从我的结果中轻松地做到这一点。如果您还有其他需要,请告诉我。

DECLARE @YourTable table (ID INT IDENTITY(1,1), String varchar(200))
INSERT @YourTable(String)
VALUES  ('V_9_0_2_2_70_0_0_3_B'),
        ('ABC_01_23_45_67_89_10_11_12_XYZ');

WITH SplitString AS
(
    SELECT  ID,
            LEFT(String,CHARINDEX('_',String)-1) AS Part,
            RIGHT(String,LEN(String)-CHARINDEX('_',String)) AS Remainder,
            1 AS RecursionCount
    FROM @YourTable
    WHERE String IS NOT NULL AND CHARINDEX('_',String) > 0

    UNION ALL

    SELECT  ID,
            LEFT(Remainder,CHARINDEX('_',Remainder)-1),
            RIGHT(Remainder,LEN(Remainder)-CHARINDEX('_',Remainder)),
            RecursionCount + 1
        FROM SplitString
        WHERE Remainder IS NOT NULL AND CHARINDEX('_',Remainder) > 0

    UNION ALL

    SELECT  ID,
            Remainder,
            null,
            recursionCount + 1
    FROM SplitString
    WHERE Remainder IS NOT NULL AND CHARINDEX('_',Remainder) = 0
)

SELECT *
FROM
(
    SELECT  CONCAT('w_grup',RecursionCount) w_grups,Part,ID
    FROM SplitString
) A
PIVOT
(
    MAX(Part) FOR w_grups IN (w_grup1,w_grup2,w_grup3,w_grup4,w_grup5,w_grup6,w_grup7,w_grup8,w_grup9,w_grup10)
) pvt

结果:

ID          w_grup1                w_grup2                w_grup3                w_grup4                w_grup5                w_grup6                w_grup7                w_grup8                w_grup9                w_grup10
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1           V                      9                      0                      2                      2                      70                     0                      0                      3                      B
2           ABC                    01                     23                     45                     67                     89                     10                     11                     12                     XYZ