Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 字符串被拆分为多个变量_Sql_Sql Server - Fatal编程技术网

Sql 字符串被拆分为多个变量

Sql 字符串被拆分为多个变量,sql,sql-server,Sql,Sql Server,我有一个看起来像这样的字符串: '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 等等 我该怎么做呢?如果有固定数量的变量,可以使用一点XML Declare @S varchar(max) = '1.25,5.34,6.9,8.6547,2.3' Declare @Var

我有一个看起来像这样的字符串:

'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
等等


我该怎么做呢?

如果有固定数量的变量,可以使用一点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
Declare@S varchar(max)='1.25,5.34,6.9,8.6547,2.3'
声明@Var1 float、@Var2 float、@Var3 float、@Var4 float、@Var5 float
选择@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')
从(选择cast(''+replace(@S','','')+''作为xml)作为n)X

转换为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
存储在表变量中,但丢失顺序

基于集合的解决方案是将项目存储在表变量中,但顺序可能会丢失,正如Raymond Nijland指出的那样:

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

唯一可以施加的顺序是使用orderby进行升序或降序,它假定输入的顺序无关紧要。不是很有帮助。

您能告诉我们为什么需要这样做吗?我同意Tim的观点,需要更多关于最终目标的信息。我的第一个想法是使用一个表变量……我认为不,你真的不想这么做。这是一个很好的例子,我想将每个浮点变量插入一个单独的表中,在5值逗号删除字符串中,每个值都有特定的列名。您可以将结果存储在一个表参数中,并在INSERTsEven JSON中使用它。无需替换,只需将字符串用方括号括起来即可。输出行可以是任意顺序。顺序不能保证与输入字符串中子字符串的顺序匹配。通过在SELECT语句(order by value)上使用order by子句,可以覆盖最终排序顺序。我现在想知道,在我发表评论之后,如果函数不提供索引号,那么如何得到确定性结果?它只返回一个值?@RaymondNijland你真的不能,这就是为什么JSON可能是最好的option@RaymondNijland更奇怪的是,
STRING\u SPLIT
即使顺序没有保证。或者可能不同的值的顺序是一致的?@johncapelletti即使在2019年也没有JSON类型,这是一个相当强烈的迹象,表明XML策略不是。。。。非常出色。