SQL Server通过定界符(动态长度)将字符串分成几列

ran*_*ane 1 sql sql-server split

SQL Server无法使用MySQL split_index函数,并且我的环境遇到可访问性阻塞,无法在服务器上使用某些函数,例如 "CREATE" "INSERT"

有什么方法可以通过固定的定界符将字符串拆分为列?有3个定界符,但长度是动态的。例如STRING:有时- "AA.0.HJ"有时- "AABBCC.099.0"有时-"0.91.JAH21"

子字符串的组合不起作用。

SUBSTRING(STRING , 
            CHARINDEX('.', STRING )+1, 
            LEN(STRING )-CHARINDEX('.', STRING )
Origin:
STRING 
AA.0.HJ
AABBCC.099.0
0.91.JAH21

Target :
STRING        First    Second  Third
AA.0.HJ       AA       0       HJ
AABBCC.099.0  AABBCC   099     0
0.91.JAH21    0        91      JAH21
Run Code Online (Sandbox Code Playgroud)

在这种情况下有什么解决方案?

And*_*rea 8

基于 xml 的解决方案

declare @tmp table (STRING varchar(500))

insert into @tmp
values
 ('AA.0.HJ')
,('AABBCC.099.0')
,('0.91.JAH21')

;WITH Splitted
AS (
    SELECT STRING
        ,CAST('<x>' + REPLACE(STRING, '.', '</x><x>') + '</x>' AS XML) AS Parts
    FROM @tmp
    )
SELECT STRING
    ,Parts.value(N'/x[1]', 'varchar(50)') AS [First]
    ,Parts.value(N'/x[2]', 'varchar(50)') AS [Second]
    ,Parts.value(N'/x[3]', 'varchar(50)') AS [Third] 
FROM Splitted;
Run Code Online (Sandbox Code Playgroud)

输出:

在此输入图像描述


Red*_*vil 5

您可以使用parsename

Declare @t table (name varchar(50))

insert into @t values ('AA.0.HJ')
insert into @t values ('AABBCC.099.0')

select parsename(name,3),parsename(name,2),parsename(name,1) from @t
Run Code Online (Sandbox Code Playgroud)