从SQL字符串拆分Multipile分隔符

3 sql sql-server

如何用(#和;)拆分SQL字符串?

Billing Column,其中字符串以下面的格式保存

548784545S#15/01/2016;84854555545#13/01/2016;45454554545#21/01/2016
Run Code Online (Sandbox Code Playgroud)

拆分#和; 我想要下面的格式

548784545S    15/01/2016
84854555545  13/01/2016
45454554545  21/01/2016
Run Code Online (Sandbox Code Playgroud)

到目前为止我做了什么

SELECT SUBSTRING(CNT_SHIPPING_BILLNO, 1,
            CASE CHARINDEX('#', CNT_SHIPPING_BILLNO)
               WHEN 0
                   THEN LEN(CNT_SHIPPING_BILLNO)
               ELSE CHARINDEX('#', CNT_SHIPPING_BILLNO) - 1
           END)
       AS Billno,
       SUBSTRING(CNT_SHIPPING_BILLNO,
           CASE CHARINDEX('#', CNT_SHIPPING_BILLNO)
               WHEN 0
                   THEN LEN(CNT_SHIPPING_BILLNO) + 1
               ELSE CHARINDEX(';', CNT_SHIPPING_BILLNO) + 1
           END, 1000) AS BillDate
FROM SHIPPINGBILL
Run Code Online (Sandbox Code Playgroud)

在这里,我只使用上面的查询获得初始值

548784545S    15/01/2016;84854555545#13/01/2016;45454554545#21/01/2016
Run Code Online (Sandbox Code Playgroud)

Dev*_*art 5

DECLARE @t VARCHAR(MAX) = '548784545S#15/01/2016;84854555545#13/01/2016;45454554545#21/01/2016'

;WITH cte AS (
    SELECT x = CONVERT(XML,'<p>' + REPLACE(@t, ';', '</p><p>') + '</p>')
)
SELECT PARSENAME(val, 2), PARSENAME(val, 1)
FROM (
    SELECT val = REPLACE(t.c.value('.', 'VARCHAR(MAX)'), '#', '.')
    FROM cte
    CROSS APPLY x.nodes('p') t(c)
) t
Run Code Online (Sandbox Code Playgroud)

输出 -

--------------- ------------
548784545S      15/01/2016
84854555545     13/01/2016
45454554545     21/01/2016
Run Code Online (Sandbox Code Playgroud)