可以使用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, @[email protected])
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
版本,但沒有做太多的比較測試。
是否必須在SQL中完成? SQL不是爲分割字符串而設計的。有另一個層可以解析嗎? –
@DStanley你不知道我多麼希望這可能是其他地方 – DidIReallyWriteThat
是你想要的輸出每行輸入多行像你的樣本? –