参考这个:
http://expert.csdn.net/Expert/topic/2298/2298541.xml?temp=.8383905
有一个字符型变量A='12.0,13.00,156.000,2315'
现要得到数值:12.0 13.00 156.000 2315请问如何用 SQL 写一通用语句 ,100' create function f_splitstr(@SourceSql varchar(8000),@StrSeprate varchar(10))
returns @temp table(F1 varchar(100))
as
begin
declare @i int
set @SourceSql=rtrim(ltrim(@SourceSql))
set @i=charindex(@StrSeprate,@SourceSql)
while @i>=1
begin
insert @temp values(left(@SourceSql,@i-1))
set @SourceSql=substring(@SourceSql,@i+1,len(@SourceSql)-@i)
set @i=charindex(@StrSeprate,@SourceSql)
end
if @SourceSql<>''
insert @temp values(@SourceSql)
return
end
-执行
select * from dbo.f_splitstr('1,2,3,4',',')或者
declare @sql varchar(8000)
set @sql='1,2,3,4'
select @sql='select '+replace(@sql,',',' union all select ')
exec(@sql)
http://expert.csdn.net/Expert/topic/2298/2298541.xml?temp=.8383905
有一个字符型变量A='12.0,13.00,156.000,2315'
现要得到数值:12.0 13.00 156.000 2315请问如何用 SQL 写一通用语句 ,100' create function f_splitstr(@SourceSql varchar(8000),@StrSeprate varchar(10))
returns @temp table(F1 varchar(100))
as
begin
declare @i int
set @SourceSql=rtrim(ltrim(@SourceSql))
set @i=charindex(@StrSeprate,@SourceSql)
while @i>=1
begin
insert @temp values(left(@SourceSql,@i-1))
set @SourceSql=substring(@SourceSql,@i+1,len(@SourceSql)-@i)
set @i=charindex(@StrSeprate,@SourceSql)
end
if @SourceSql<>''
insert @temp values(@SourceSql)
return
end
-执行
select * from dbo.f_splitstr('1,2,3,4',',')或者
declare @sql varchar(8000)
set @sql='1,2,3,4'
select @sql='select '+replace(@sql,',',' union all select ')
exec(@sql)
declare @sql varchar(8000)
set @sql='1,2,3,4'
select @sql='select '+replace(@sql,',',' union all select ')
exec(@sql)这种写法, 如果'1,2,3,4' 换成 asdfsd,asdfas,23423,dfgdf
就不对了
1 y Dept1,Dept2,Dept3
1 n Dept1,Dept4,Dept3,..
2 y ..
2 n ..
y表示选修,n表示必修
部门和小组存的都是用逗号隔开的东东,长度,多少不定
想要写成下边的形势:
课程 选修/必修 部门
1 y Dept1
1 y Dept2
1 y Dept3
1 n Dept1
1 n Dept2
。
--创建字符串分拆的函数
create function fsplit(
@str varchar(8000) --要分拆的字符串
,@spli varchar(10) --字符串分隔符
)
returns @re table(istr varchar(8000))
as
begin
declare @i int,@splen int
select @splen=len(@spli)
,@i=charindex(@spli,@str)
while @i>0
begin
insert into @re values(left(@str,@i-1))
select @str=substring(@str,@i+@splen,8000)
,@i=charindex(@spli,@str)
end
if @str<>'' insert into @re values(@str)
return
end
go
--定义原表,进行数据测试
create table tb(课程 int,[选修/必修] varchar(1),部门 varchar(8000),小组 varchar(8000))
insert into tb
select 1,'y','Dept1,Dept2,Dept3','Team1,Team2,Team3'
union all select 1,'n','Dept1,Dept4,Dept3','Team1,Team2,Team3'
--用游标进行数据处理
--定义保存处理结果的表
declare @tb1 table(课程 int,[选修/必修] varchar(1),部门 varchar(8000))
declare @tb2 table(课程 int,[选修/必修] varchar(1),小组 varchar(8000))--定义游标进行处理
declare #tb cursor for select * from tb
declare @a int,@b varchar(1),@c varchar(8000),@d varchar(8000)--进行数据处理
open #tb
fetch next from #tb into @a,@b,@c,@d
while @@fetch_status=0
begin
insert into @tb1 select @a,@b,istr from dbo.fsplit(@c,',')
insert into @tb2 select @a,@b,istr from dbo.fsplit(@d,',')
fetch next from #tb into @a,@b,@c,@d
end
close #tb
deallocate #tb
--显示处理结果
select a.*,b.小组
from @tb1 a inner join @tb2 b on a.课程=b.课程--删除数据测试环境
drop function fsplit
drop table tb
select a.*,b.小组
from @tb1 a inner join @tb2 b on a.课程=b.课程 and a.[选修/必修]=b.[选修/必修]--测试结果:课程 选修/必修 部门 小组
----------- ----- ---------- ----------
1 y Dept1 Team1
1 y Dept1 Team2
1 y Dept1 Team3
1 y Dept2 Team1
1 y Dept2 Team2
1 y Dept2 Team3
1 y Dept3 Team1
1 y Dept3 Team2
1 y Dept3 Team3
1 n Dept1 Team1
1 n Dept1 Team2
1 n Dept1 Team3
1 n Dept4 Team1
1 n Dept4 Team2
1 n Dept4 Team3
1 n Dept3 Team1
1 n Dept3 Team2
1 n Dept3 Team3(所影响的行数为 18 行)