Вы можете попытаться создать функцию fn_split
.
CREATE FUNCTION fn_split
( @Words nvarchar(MAX)
, @splitStr varchar(50)
)
RETURNS @Result_Table TABLE
(
[word] nvarchar(max) NULL
)
BEGIN
Declare @TempStr nvarchar(MAX)
WHILE (CHARINDEX(@splitStr,@Words)>0)
BEGIN
Set @TempStr=SUBSTRING(@Words,1,CHARINDEX(@splitStr,@Words)-1)
Insert into @Result_Table (word) Values (@TempStr)
Set @Words = REPLACE(@Words,@TempStr+@splitStr,'')
END/*End While*/
IF(LEN(RTRIM(LTRIM(@Words)))>0 And CHARINDEX(@splitStr,RTRIM(LTRIM(@Words)))=0)
Begin
Set @TempStr=@Words
Insert into @Result_Table (word) Values (@TempStr)
End
RETURN
END
, затем используйте небольшой навык, пропустите несколько на один пробел на DISK_VOLUME
, замените три раза.
В следующем шаге используйте row_number
оконную функцию, чтобы получить номер для агрегатной функции условия.
;WITH CTE as(
SELECT val,word,ROW_NUMBER() OVER(PARTITION BY val order by val) rn
FROM (
SELECT replace(replace(replace(DISK_VOLUME,' ','*&'),'&*',''),'*&',' ') val
FROM T
) t1 CROSS APPLY fn_split(t1.val,' ') v
)
SELECT max(CASE WHEN rn = 1 THEN word END) 'Caption',
max(CASE WHEN rn = 2 THEN word END) 'Space1',
max(CASE WHEN rn = 3 THEN word END) 'Space 2',
max(CASE WHEN rn = 4 THEN word END) 'Volume Name '
FROM CTE
GROUP BY val
sqlfiddle