Разделить строку в SQL Server 2012 подряд - PullRequest
0 голосов
/ 16 мая 2018

Строка находится в

@txt nvarchar(max)='2450,10,54,kb2344,kd5433;87766,500,100,ki5332108,ow092827'

И я хочу вывод, подобный этому:

Id. Val1. Val2. Val3. Val4. Val5.
1. 2450 10 54 kb2344 kd5433.
2. 87766 500 100 ki5332108 ow09287

Кто-нибудь может подсказать, как это сделать?

Я погуглил его и нашел это решение.Но это для двух значений, разделенных запятыми, но в моем случае их пять:

 DECLARE @Var NVARCHAR(100) = '2450,10,54,kb2344,kd5433;87766,500,100,ki5332108,ow092827'
 SELECT LEFT(@Var, CHARINDEX(';', @Var) - 1) ,SUBSTRING(@Var, CHARINDEX(';', @Var) + 1, LEN(@Var)- LEN(LEFT(@Var, CHARINDEX(';', @Var)))- LEN(RIGHT(@Var, CHARINDEX(';', REVERSE(@Var))))) AS [Job] , RIGHT(@Var, CHARINDEX(';', REVERSE(@Var))-1)

1 Ответ

0 голосов
/ 16 мая 2018

Принимая значения 1-5.Это можно легко сделать с помощью небольшого XML в сочетании с CROSS APPLY

Если числовые столбцы являются переменными, вам нужно перейти в DYNAMIC.

EDIT - Измененоnvarchar

Пример

Declare @txt  nvarchar(max)='2450,10,54,kb2344,kd5433;87766,500,100,ki5332108,ow092827'

Select ID=A.RetSeq
      ,B.*
 From (
        Select RetSeq = Row_Number() over (Order By (Select null)) 
              ,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'nvarchar(max)')))
        From  (Select x = Cast('<x>' + replace(@txt ,';','</x><x>')+'</x>' as xml).query('.')) as A 
        Cross Apply x.nodes('x') AS B(i)
      ) A
 Cross Apply (
                Select Val1 = ltrim(rtrim(xDim.value('/x[1]','nvarchar(max)')))
                      ,Val2 = ltrim(rtrim(xDim.value('/x[2]','nvarchar(max)')))
                      ,Val3 = ltrim(rtrim(xDim.value('/x[3]','nvarchar(max)')))
                      ,Val4 = ltrim(rtrim(xDim.value('/x[4]','nvarchar(max)')))
                      ,Val5 = ltrim(rtrim(xDim.value('/x[5]','nvarchar(max)')))
                From  (Select Cast('<x>' + replace(A.RetVal,',','</x><x>')+'</x>' as xml) as xDim) as B1
             ) B

Возвращает

ID  Val1    Val2    Val3    Val4        Val5
1   2450    10      54      kb2344      kd5433
2   87766   500     100     ki5332108   ow092827
...