使用分隔符拆分字符串,并在TSQL的变量中设置每个部分
我需要使用以下格式拆分一些字符串:使用分隔符拆分字符串,并在TSQL的变量中设置每个部分,tsql,stored-procedures,split,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_g
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)
我该怎么做?一些建议?那么,像这样的建议
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 > ''
从我想你最好的选择是递归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
它返回:“语句终止。在语句完成之前,最大递归100已用尽。”看起来,因为上面的代码正在基于尾随下划线(例如“3”)执行其子字符串,它到达字符串的末尾,并以“B”作为其项值。因为它没有下划线,所以会不断循环以查找下划线。然后它达到100个循环的极限,并抛出递归错误。可能值得加入一个case语句来检查被检查的字符串是否包含下划线。是否总是有相同数量的字符串?还是会改变?是的,当然。总是10个字符串