STRING_SPLIT для нескольких переменных - PullRequest
3 голосов
/ 17 мая 2019

У меня есть строка, которая выглядит так:

'1.25,5.34,6.9,8.6547,2.3'

Я хотел бы сохранить каждое значение, разделенное запятыми, в переменные, например, но программно в T-SQL:

Declare @Var1 float
Set @Var1 = 1.25
...

@Var2 = 5.34 
@Var3 = 6.9

И так далее и тому подобное.

Как бы я это сделал?

Ответы [ 2 ]

4 голосов
/ 17 мая 2019

Конвертировать в JSON

Возможно, самым простым решением было бы преобразовать строку в массив JSON и получить доступ к элементам по позиции:

declare @text varchar(200)='1.25,5.34,6.9,8.6547,2.3'
declare @json varchar(202)='[' + @text + ']'

declare @var1 numeric(18,5)= JSON_VALUE(@json,'$[0]')
declare @var2 numeric(18,5)= JSON_VALUE(@json,'$[1]')

select @var1,@var2

Сохранить в табличной переменной, но потерять порядок

Основанным на множестве решением было бы хранить элементы в табличной переменной НО, вероятно, порядок будет потерян , как заметил Рэймонд Нейланд:

declare @text varchar(200)='1.25,5.34,6.9,8.6547,2.3'

declare @values table (id int identity,val varchar(20))

insert into @values (val)
select trim(value) from STRING_SPLIT(@text,',') x

insert into SomeTable (value1)
select val 
from @values where ID=1

Единственный порядок, который может быть наложен - это возрастание или убывание, используя ORDER BY, который предполагает, что порядок ввода не имеет значения. Не очень полезно.

2 голосов
/ 17 мая 2019

Если у вас фиксированное количество переменных, вы можете использовать немного XML

Declare @S varchar(max) = '1.25,5.34,6.9,8.6547,2.3'

Declare @Var1 float,@Var2 float,@Var3 float,@Var4 float,@Var5 float

Select @Var1 = n.value('/x[1]','float')
      ,@Var2 = n.value('/x[2]','float')
      ,@Var3 = n.value('/x[3]','float')
      ,@Var4 = n.value('/x[4]','float')
      ,@Var5 = n.value('/x[5]','float')
From  (Select cast('<x>' + replace(@S,',','</x><x>')+'</x>' as xml) as n) X
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...