Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.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 2008R2中将单个单元格拆分为多列?_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

如何在sql server 2008R2中将单个单元格拆分为多列?

如何在sql server 2008R2中将单个单元格拆分为多列?,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我想为各个列拆分每个名称 create table split_test(value integer,Allnames varchar(40)) insert into split_test values(1,'Vinoth,Kumar,Raja,Manoj,Jamal,Bala'); select * from split_test; Value Allnames ------------------- 1 Vinoth,Kumar,Raja,Manoj,Jamal,Bala

我想为各个列拆分每个名称

create table split_test(value integer,Allnames varchar(40))
insert into split_test values(1,'Vinoth,Kumar,Raja,Manoj,Jamal,Bala');
select * from split_test;

Value   Allnames
-------------------
1       Vinoth,Kumar,Raja,Manoj,Jamal,Bala
预期产量


通过这个例子,你可以得到一个想法

declare @str varchar(max)
set @str = 'Hello world'

declare @separator varchar(max)
set @separator = ' '

declare @Splited table(id int identity(1,1), item varchar(max))

set @str = REPLACE(@str,@separator,'''),(''')

set @str = 'select * from (values('''+@str+''')) as V(A)' 

insert into @Splited
exec(@str)
select * from @Splited

下面是一个sql语句,它使用递归CTE将名称拆分为行,然后将行透视为列。

步骤2: 将split_测试表的数据与数字表连接起来,我们可以得到从开始的所有零件,。 然后在2之间取第一部分,形成每一行。如果存在空值,请使用union添加它们

select value , 
 ltrim(rtrim(substring(allnames,number+1,charindex(',',substring(allnames,number,40),2)-2))) as name
from
 (select value, ','+allnames+',' as allnames
  from split_test) as t1
left join numbers
on number<= len(allnames)
where substring(allnames,number,1)=',' 
 and substring(allnames,number,40)<>','
union
select value, Allnames
from split_test
where Allnames is null
步骤3:将名称从行透视到列,就像我在上面的第一次尝试一样,此处省略。

这是一个非常非常糟糕的设计。请规范化您的表。在google中搜索:sql server将csv转换为行。的可能重复除非您有最大拆分的上限,否则您需要动态SQL。这是一个糟糕的设计,你试图将其拆分为实际列的事实应该是你的第一个线索。如果你环顾这个问题,你会发现值的数量不是固定的N1,N2…,所以你不能决定它最多6个级别。它可能或多或少。。。
with names as
(select 
  value,
  1 as name_id,
    substring(Allnames,1,charindex(',',Allnames+',', 0)-1)  as name,
    substring(Allnames,charindex(',',Allnames, 0)+1, 40) as left_names
from split_test
union all
select 
  value,
  name_id +1,
  case when charindex(',',left_names, 0)> 0 then
    substring(left_names,1,charindex(',',left_names, 0)-1) 
  else left_names end as name,
  case when charindex(',',left_names, 0)> 0 then
    substring(left_names,charindex(',',left_names, 0)+1, 40) 
  else '' end as left_names
from names
where ltrim(left_names)<>'')
select value,
  [1],[2],[3],[4],[5],[6],[7],[8],[9]
from (select value,name_id,name from names) as t1
PIVOT (MAX(name) FOR name_id IN ( [1],[2],[3],[4],[5],[6],[7],[8],[9] ) ) AS t2
CREATE TABLE Numbers( Number  int   not null primary key);
with n as
(select 1 as num
union all
select num +1
from n
where num<100)
insert into numbers
select num from n;
select value , 
 ltrim(rtrim(substring(allnames,number+1,charindex(',',substring(allnames,number,40),2)-2))) as name
from
 (select value, ','+allnames+',' as allnames
  from split_test) as t1
left join numbers
on number<= len(allnames)
where substring(allnames,number,1)=',' 
 and substring(allnames,number,40)<>','
union
select value, Allnames
from split_test
where Allnames is null