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很高兴它有帮助