+ -
当前位置:首页 → 问答吧 → sql server2000中怎么将一个字符串分割成多个字段??急,在线等

sql server2000中怎么将一个字符串分割成多个字段??急,在线等

时间:2011-12-27

来源:互联网

有一个字符串,例如 aasd|asd|dsfsdf|asd|asdasf|asfaf|asf....
怎样将之以|分割成字段,|线不要

作者: huyou_ni   发布时间: 2011-12-27

SQL code
  use tempdb
  go
  --测试数据
  declare @s varchar(1000)
  set @s='ak47,mp5,1,23'
  /*要求输出结果
  S
  ----
  ak47
  mp5
  1
  23
  */
  --3种方法对比:
  --1.[朴实]动态Exec方法:
  declare @s1 varchar(1000)
  set @s1=right(replace(','+@s,',',''' as S union select '''),len(replace(','+@s,',',''' as S union select '''))-12)+''''
  exec(@s1)
  --2.[变通]表交叉方法:
  select replace(reverse((left(s,charindex(',',s)))),',','') as S from(
  select r,reverse(left(@s,r))+',' as s
  from(
  select (select count(*) from sysobjects where name<=t.name ) as r
  from sysobjects t
  )a where r<=len(@s)
  and left(@s+',',r+1) like '%,'
  )t order by r
  --3.[高级]XML方法:
  DECLARE @idoc int;
  DECLARE @doc xml;
  set @doc=cast('<Root><item><S>'+replace(@s,',','</S></item><item><S>')+'</S></item></Root>' as xml)
  EXEC sp_xml_preparedocument @Idoc OUTPUT, @doc
  SELECT * FROM OPENXML (@Idoc, '/Root/item',2)
  WITH (
  [S] varchar(10)
  ) 

作者: fredrickhu   发布时间: 2011-12-27

SQL code
declare @s varchar(1000)
set @s='aasd|asd|dsfsdf|asd|asdasf|asfaf|asf'
select col=convert(varchar(10),left(@s,charindex('|',@s)-1)) into #
set @s=right(@s,len(@s)-charindex('|',@s))+'|'
while len(@s)>1
begin
insert into # select convert(varchar(10),left(@s,charindex('|',@s)-1))
set @s=right(@s,len(@s)-charindex('|',@s))
end
select * from #
/*
col
----------
asd
dsfsdf
asd
asdasf
asfaf
asf
aasd

(7 行受影响)

*/
go
drop table #

作者: qianjin036a   发布时间: 2011-12-27

SQL code

create function [dbo].[m_split](@c varchar(2000),@split varchar(2))   
  returns @t table(col varchar(200))   
  as   
    begin   
      while(charindex(@split,@c)<>0)   
        begin   
          insert @t(col) values (substring(@c,1,charindex(@split,@c)-1))   
            set @c = stuff(@c,1,charindex(@split,@c),'') 
        end   
      insert @t(col) values (@c)   
      return   
end

select * from dbo.m_split('aasd|asd|dsfsdf|asd|asdasf|asfaf|asf','|')
/*
col
-------------
aasd
asd
dsfsdf
asd
asdasf
asfaf
asf
*/

作者: maco_wang   发布时间: 2011-12-27

不好意思问题没讲清楚,我的是sql server 2000

作者: huyou_ni   发布时间: 2011-12-27

三位大神驾临,额额额,

作者: Super_Ninja   发布时间: 2011-12-27

二楼和三楼的都可以,当我想让字符在一行上面,字段有50个之多,而且字符串是abc表中得a列数据
请问怎么实现 谢谢了

作者: huyou_ni   发布时间: 2011-12-27

又是个想用SQL把不规范数据做报表的

作者: kuqideyupian   发布时间: 2011-12-27

2000拆分列:
SQL code
create table tb(id int,col varchar(20))
insert into tb select 1,'aa,bb'
insert into tb select 2,'aaa,bbb,ccc'
go
SELECT TOP 8000 id = IDENTITY(int, 1, 1) INTO # FROM syscolumns a, syscolumns b  
SELECT A.id, SUBSTRING(A.[col], B.id, CHARINDEX(',', A.[col] + ',', B.id) - B.id) col
FROM tb A, # B
WHERE SUBSTRING(',' + A.[col], B.id, 1) = ','
/*
id          col
----------- --------------------
1           aa
1           bb
2           aaa
2           bbb
2           ccc

(5 行受影响)


*/
go
DROP TABLE tb,#

作者: qianjin036a   发布时间: 2011-12-27

SQL code
CREATE TABLE #temp
(
   id int,
   test varchar(200)
)
INSERT INTO #temp(id,test)VALUES(1,'aasd|asd|dsfsdf|asd|asdasf|asfaf|')


SELECT id,test,n,SUBSTRING(test,n,charindex('|',test,n)-n) AS newtest
FROM #temp AS t
LEFT JOIN nums ON n<=len(test) AND substring('|' + test,n,1)='|'



其中nums表是一个字典表,就是只有一个字段,n 里面是1,2,3,4,5,6这样的数值

作者: chenguang79   发布时间: 2011-12-27