if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_split]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[f_split]
GOif exists (select * from dbo.sysobjects where id = object_id(N'[序数表]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [序数表]
GO--为了效率,所以要一个辅助表配合
select top 8000 id=identity(int,1,1) into 序数表 
from syscolumns a,syscolumns b
alter table 序数表 add constraint pk_id_序数表 primary key(id)
go/*--字符串分函数 分拆指定分隔符的的字符串,返回结果表--邹建 2004.04(引用请保留此信息)--*//*--调用示例 select * from f_split('001|002|003|009|085','|')
--*/
create function f_split(
@str varchar(8000), --要分拆的字符串
@splitchar varchar(10) --分隔符
)returns table
as
return(
select re=substring(@str,id,charindex(@splitchar,@str+@splitchar,id)-id)
from 序数表 
where id<=len(@str)+1 and charindex(@splitchar,@splitchar+@str,id)-id=0
)
go

解决方案 »

  1.   

    --如何将字符串按指定的格式拆分成记录集
    declare @s varchar(8000),@sql nvarchar(4000)
    set @s='001|002|003|009|085'
    set @sql='select '''+replace(@s,'|',''' col union all select ''')+''' col'
    set @sql='select * into ##tem from ('+@sql+') t'
    exec sp_executesql @sql
    select * from ##tem
    drop table ##tem
      

  2.   

    高手们,这已经测试成功。多问一句:
    '001|002|003|009|085'对应的表Users中的字段name的值,如何使分离的值如'王一|李主|aa|...'这样给取出来?请高手指教了。
      

  3.   

    全局临时表##tem里存放的就是那些值,直接用select取出
      

  4.   

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_split]') and xtype in (N'FN', N'IF', N'TF'))
    drop function [dbo].[f_split]
    GOif exists (select * from dbo.sysobjects where id = object_id(N'[序数表]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [序数表]
    GO--为了效率,所以要一个辅助表配合
    select top 8000 id=identity(int,1,1) into 序数表 
    from syscolumns a,syscolumns b
    alter table 序数表 add constraint pk_id_序数表 primary key(id)
    go/*--字符串分函数 分拆指定分隔符的的字符串,返回结果表--邹建 2004.04(引用请保留此信息)--*//*--调用示例 select dbo.f_split('001|002|003|009|085','|')
    --*/
    create function f_split(
    @str varchar(8000), --要分拆的字符串
    @splitchar varchar(10) --分隔符
    )returns varchar(8000)
    as
    begin
    declare @r varchar(8000)
    set @r=''
    select @r=@r+','+name
    from users a,(
    select re=substring(@str,id,charindex(@splitchar,@str+@splitchar,id)-id)
    from 序数表 
    where id<=len(@str)+1 and charindex(@splitchar,@splitchar+@str,id)-id=0
    )b where a.userid=b.re
    return(stuff(@r,1,1,''))
    end
    go
      

  5.   

    改成上面的函数就可以了,注意修改函数中的 userid为你的 users表与拆分后的编号对应的字段名