Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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 server 将逗号分隔的值转换为多列表_Sql Server_Tsql - Fatal编程技术网

Sql server 将逗号分隔的值转换为多列表

Sql server 将逗号分隔的值转换为多列表,sql-server,tsql,Sql Server,Tsql,我需要将逗号分隔的列表转换为多列表,如果您能帮助我,我将不胜感激 输入 [aaa,111],[bbb,222],[ccc,333],[ddd,444] col1 col2 aaa 111 bbb 222 ccc 333 ddd 444 所需输出 [aaa,111],[bbb,222],[ccc,333],[ddd,444] col1 col2 aaa 111 bbb 222 ccc 33

我需要将逗号分隔的列表转换为多列表,如果您能帮助我,我将不胜感激

输入

[aaa,111],[bbb,222],[ccc,333],[ddd,444]
col1      col2
aaa       111
bbb       222
ccc       333
ddd       444
所需输出

[aaa,111],[bbb,222],[ccc,333],[ddd,444]
col1      col2
aaa       111
bbb       222
ccc       333
ddd       444

使用字符串拆分函数,首先在
,[
上拆分以获取行。然后在
上拆分每一行以获取列。

如果对帮助程序函数打开

厌倦了提取字符串(左、右、charindex、patindex等),我修改了一个parse/split函数来接受两个不相似的分隔符

示例

Declare @S varchar(max) = '[aaa,111],[bbb,222],[ccc,333],[ddd,444]'

Select Col1 = left(RetVal,NullIf(charindex(',',RetVal),0)-1)
      ,Col2 = stuff(RetVal,1,NullIf(charindex(',',RetVal),0),'')
 From [dbo].[tvf-Str-Extract](@S,'[',']')
返回

Col1   Col2
aaa    111
bbb    222
ccc    333
ddd    444
TVF如果感兴趣

CREATE FUNCTION [dbo].[tvf-Str-Extract] (@String varchar(max),@Delimiter1 varchar(100),@Delimiter2 varchar(100))
Returns Table 
As
Return (  

with   cte1(N)   As (Select 1 From (Values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) N(N)),
       cte2(N)   As (Select Top (IsNull(DataLength(@String),0)) Row_Number() over (Order By (Select NULL)) From (Select N=1 From cte1 N1,cte1 N2,cte1 N3,cte1 N4,cte1 N5,cte1 N6) A ),
       cte3(N)   As (Select 1 Union All Select t.N+DataLength(@Delimiter1) From cte2 t Where Substring(@String,t.N,DataLength(@Delimiter1)) = @Delimiter1),
       cte4(N,L) As (Select S.N,IsNull(NullIf(CharIndex(@Delimiter1,@String,s.N),0)-S.N,8000) From cte3 S)

Select RetSeq = Row_Number() over (Order By N)
      ,RetPos = N
      ,RetVal = left(RetVal,charindex(@Delimiter2,RetVal)-1) 
 From  (
        Select *,RetVal = Substring(@String, N, L) 
         From  cte4
       ) A
 Where charindex(@Delimiter2,RetVal)>1

)
/*
Max Length of String 1MM characters

Declare @String varchar(max) = 'Dear [[FirstName]] [[LastName]], ...'
Select * From [dbo].[tvf-Str-Extract] (@String,'[[',']]')
*/
只是为了好玩,试试看

Select * From [dbo].[tvf-Str-Extract](@S,'[',']')
你会得到…然后我们就解析RetVal

RetSeq  RetPos  RetVal
1       2       aaa,111
2       12      bbb,222
3       22      ccc,333
4       32      ddd,444

有一种非常简单的方法可以直接将其转换为XML:

DECLARE @YourString VARCHAR(100)='[aaa,111],[bbb,222],[ccc,333],[ddd,444]';

--This will do some replacements to transform your string to XML:
SELECT CAST(REPLACE(REPLACE('<x><y>' + REPLACE(REPLACE(@YourString,'],[','</y></x><x><y>'),',','</y><y>') + '</y></x>',']',''),'[','') AS XML);

什么版本的sql server?2016年有内置函数可以轻松实现这一点,SPLIT()sql server 2012,是的,我知道SS 2016中有SPLIT,但无法使用和替换(“[”,“)什么,没有XML?:-)谢谢@shnugo这对我有效,我将尝试在内联函数中测试包装它
Column1 Column2
aaa     111
bbb     222
ccc     333
ddd     444