日期:2014-05-18  浏览次数:20638 次

谁能帮我写个函数?
谁能帮我写个函数?要求这个函数能处理一个类似 "1213|sds|sdf|ggg|ss "的字符串,能将这个用 "| "分隔出来字符串插入到一个临时表的一行,结果返回这个临时表。但是分隔符的个数不固定,也就是说这个字符串也可能是 "232|sb|sd|aa|ss|sd "或 "aa|xx|sd ",也就是说这个临时表的列可以动态创建,分隔出几个字符串就创建几个列,并可创建出列名!拜托各位老大!

------解决方案--------------------
declare @str varchar(1000)
set @str = '1213|sds|sdf|ggg|ss '

declare @Com table (Com varchar(100))

while charindex( '| ', @str) > 0
begin
insert @Com select left(@str, charindex( '| ', @str) - 1)
set @str = right(@str len(@str) - charindex( '| ', @str))
end

select * from @Com
------解决方案--------------------
--分解字符号串
declare @str varchar(8000)
set @str = '1213|sds|sdf|ggg|ss '
declare @sql varchar(8000)
set @sql= 'select ' ' '+replace(@str, '| ', ' ' ' union all select ' ' ')+ ' ' ' '
exec( @sql )


----
1213
sds
sdf
ggg
ss

------解决方案--------------------
除非你的每个字符串中 "| "分隔符是一样多,否则就麻烦了,以下补的是一样多的情况:
create proc test
@sql varchar(1000),
@Tb varchar(20)
as
declare @i int

set @i=0
set @sql=@sql+ '| '
while charindex( '| ',@sql)> 0
begin
set @sql=stuff(@sql,charindex( '| ',@sql),1, ' ' ' as A '+ltrim(@i)+ ', ' ' ')
set @I=@i+1
end
if object_id(@tb) is null
select @sql= 'select * into '+@Tb+ ' from (select ' ' '+left(@sql,len(@sql)-2)+ ') aa '
else
select @sql= 'insert '+@Tb+ ' select * from (select ' ' '+left(@sql,len(@sql)-2)+ ') aa '
exec(@sql)
go
exec test '1213|sds|sdf|ggg|ss ', 'testTable '
go
exec test 'xx|bb|sdf|www|ss ', 'testTable '
select * from testTable