Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.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_Tsql - Fatal编程技术网

SQL,从,分隔行到列

SQL,从,分隔行到列,sql,sql-server,tsql,Sql,Sql Server,Tsql,输出 Create table test123 ( SeqId int, string1 varchar(100), string2 varchar(100) ) insert into test123(SeqId,string1,string2)values (10,'a,b,c','x,y,z'), (20,'d,e,f','p,q,r') 这将允许字符串中的项目数量可变/不均匀 几乎任何拆分/解析函数都可以。我提供了一个,它还提供了项目的序列号 选项1:不带解析函数 SeqId Row

输出

Create table test123
(
SeqId int,
string1 varchar(100),
string2 varchar(100)
)

insert into test123(SeqId,string1,string2)values
(10,'a,b,c','x,y,z'),
(20,'d,e,f','p,q,r')

这将允许字符串中的项目数量可变/不均匀

几乎任何拆分/解析函数都可以。我提供了一个,它还提供了项目的序列号

选项1:不带解析函数

SeqId RowNum String1 String2
10  1   a   x
10  2   b   y
10  3   c   z
20  1   d   p
20  2   e   q
20  3   f   r
Declare @YourTable table (SeqId int,string1 varchar(100),string2 varchar(100))
insert into @YourTable values
(10,'a,b,c','x,y,z'),
(20,'d,e,f','p,q,r')

Select A.SeqId
      ,B.*
 From  @YourTable A
 Cross Apply (
                Select RowNum  = RetSeq
                      ,String1 = max(String1)
                      ,String2 = max(String2)
                 From (
                        Select RetSeq  = Row_Number() over (Order By (Select null))
                              ,String1 = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)')))
                              ,String2 = ''
                        From  (Select x = Cast('<x>' + replace((Select replace(A.String1,',','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml).query('.')) as A 
                        Cross Apply x.nodes('x') AS B(i)
                        Union All
                        Select RetSeq  = Row_Number() over (Order By (Select null))
                              ,String1 = ''
                              ,String2 = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)')))
                        From  (Select x = Cast('<x>' + replace((Select replace(A.String2,',','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml).query('.')) as A 
                        Cross Apply x.nodes('x') AS B(i)
                      ) B1
                 Group By RetSeq
             ) B
两者都返回

SeqId RowNum String1 String2
10  1   a   x
10  2   b   y
10  3   c   z
20  1   d   p
20  2   e   q
20  3   f   r
Declare @YourTable table (SeqId int,string1 varchar(100),string2 varchar(100))
insert into @YourTable values
(10,'a,b,c','x,y,z'),
(20,'d,e,f','p,q,r')

Select A.SeqId
      ,B.*
 From  @YourTable A
 Cross Apply (
                Select RowNum  = RetSeq
                      ,String1 = max(String1)
                      ,String2 = max(String2)
                 From (
                        Select RetSeq  = Row_Number() over (Order By (Select null))
                              ,String1 = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)')))
                              ,String2 = ''
                        From  (Select x = Cast('<x>' + replace((Select replace(A.String1,',','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml).query('.')) as A 
                        Cross Apply x.nodes('x') AS B(i)
                        Union All
                        Select RetSeq  = Row_Number() over (Order By (Select null))
                              ,String1 = ''
                              ,String2 = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)')))
                        From  (Select x = Cast('<x>' + replace((Select replace(A.String2,',','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml).query('.')) as A 
                        Cross Apply x.nodes('x') AS B(i)
                      ) B1
                 Group By RetSeq
             ) B

有兴趣的UDF

Declare @YourTable table (SeqId int,string1 varchar(100),string2 varchar(100))
insert into @YourTable values
(10,'a,b,c','x,y,z'),
(20,'d,e,f','p,q,r')

Select A.SeqId
      ,B.*
 From  @YourTable A
 Cross Apply (
                Select RowNum = RetSeq
                      ,String1= max(String1)
                      ,String2= max(String2)
                 From (
                        Select RetSeq,String1=RetVal,String2='' from [dbo].[udf-Str-Parse](A.string1,',')
                        Union All
                        Select RetSeq,String1='',String2=RetVal from [dbo].[udf-Str-Parse](A.string2,',')
                      ) B1
                 Group By RetSeq

             ) B

使用动态SQL检查以下解决方案

declare@t表(SeqId int,string1-varchar(100),string2-varchar(100))
声明@result表(SeqId int、RowNum int、String1-varchar(10)、String2-varchar(10))
声明@SeqId int
声明@string1 varchar(100)
声明@string2 varchar(100)
声明@char1 varchar(5)
声明@char2 varchar(5)
声明@count1 int
声明@count2 int
声明@rownum int
从test123插入@t select*
存在时(从@t中选择*
开始
从@t中选择top 1@SeqId=SeqId、@string1=string1、@string2=string2
设置@rownum=1

while@rownum您的问题是什么?可能重复的方法大约有一百万种和一种分割逗号分隔字符串的方法。随便找一个。e、 g.此处缺少大量可能的信息:逗号分隔的字符串在string1和string2中是否始终具有相同数量的元素?行之间的元素数是否相同?无论如何,为什么要以这种方式存储数据?好奇和乐于助人的人想知道。也许使用字符串分割,像宝石一样工作,真的帮了我很多。我知道当它只是一列时该怎么做,对于不止一列,你的解决方案非常有效。@SrinivasaRao很高兴它有帮助