参考这个:
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)

解决方案 »

  1.   

    对于
    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
    就不对了
      

  2.   

    写得再简单一点,这样就好了,可俺还是么弄出来课程  选修/必修    部门                        
    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   
         。
      

  3.   

    --看来只好用游标处理啦
    --创建字符串分拆的函数
    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
      

  4.   

    --显示处理结果的语句少了一个条件,应该是:
    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 行)
      

  5.   

    感谢 zjcxc(邹建)  太生动的例子了!!揭帖