您可以使用XML 功能解析字符串:
;WITH cte AS (SELECT testString = 'element1|value,element2|value2,element3|value3'
UNION SELECT 'test,1,2,3'
)
,SplitString AS (SELECT testString,
CONVERT(XML,'<String><Section>'+ REPLACE(REPLACE(testString ,'|',','),',', '</Section><Section>') + '</Section></String>') AS xmlString
FROM cte
)
SELECT xmlString.value('/String[1]/Section[1]','varchar(100)') AS Col1
,xmlString.value('/String[1]/Section[2]','varchar(100)') AS Col2
,xmlString.value('/String[1]/Section[3]','varchar(100)') AS Col3
,xmlString.value('/String[1]/Section[4]','varchar(100)') AS Col4
FROM SplitString
在这里,我刚刚将您的 | 更改为 , 并一口气完成了所有拆分,但如果不是所有偶数对,您可以分两步执行此操作,首先拆分 | 然后继续,.
您也可以查看PARSENAME(),但仅限于 4 个部分,或者您可以创建一个 PARSE 函数,例如:
/********************************************************************************************
Create Parse Function
********************************************************************************************/
CREATE FUNCTION dbo.FN_PARSE(@chunk VARCHAR(4000), @delimiter CHAR(1), @index INT )
RETURNS VARCHAR(1000)
AS
BEGIN
DECLARE
@curIndex INT = 0,
@pos INT = 1,
@prevPos INT = 0,
@result VARCHAR(1000)
WHILE @pos > 0
BEGIN
SET @pos = CHARINDEX(@delimiter, @chunk, @prevPos);
IF(@pos > 0)
BEGIN -- Characters between position and previous position
SET @result = SUBSTRING(@chunk, @prevPos, @pos-@prevPos)
END
ELSE
BEGIN -- Last Delim
SET @result = SUBSTRING(@chunk, @prevPos, LEN(@chunk))
END
IF(@index = @curIndex)
BEGIN
RETURN @result
END
SET @prevPos = @pos + 1
SET @curIndex = @curIndex + 1;
END
RETURN '' -- Else Empty
END
然后简单地调用它:
;WITH cte AS (SELECT testString = 'element1|value,element2|value2,element3|value3'
UNION SELECT 'test,1,2,3'
)
SELECT dbo.FN_PARSE(testString ,'|', 0) AS Col1
,dbo.FN_PARSE(testString ,'|', 1) AS Col2
...
FROM cte
请注意,在上述函数中,该部分的索引从 0 开始。
我目前对XML版本很感兴趣,但没有做太多的对比测试。