Sql Server字符串分割转换为表和字符串连接

在Sql查询中有不少字符串是按一定规则链接在一起的,那么肯定会遇到要把这个字符串分割成独立的个体的问题,我遇到不少人问这样类似的问题,所以就写了这个把这种字符串转换成一张表的函数。


/************************************************************************************  
  
* 函数名: StringConvertToTable  
* 函数说明: 把字符串按某一组字符分割开放到表中  
* 参数说明: @strOri被分割的字符串,@strSplit分割符  
* 作者:   
* 创建时间:   
* SELECT * from dbo.StringConvertToTable('3245,2345,343',',','')  
* SELECT * from dbo.StringConvertToTable('123(1234)423,(234),ggds(456)54',',','')  
* SELECT * from dbo.StringConvertToTable('123(1234)423,(234),ggds(456)54','(',')')  
* ---------------------------------------------------------------------------------  
  
  
************************************************************************************/  
CREATE function [dbo].[StringConvertToTable] (  
     @strOri varchar(max) ,  
     @strSplit varchar(8000) ,  
     @strSplit2 varchar(8000),
     @IfRetdEmpty bit
    )  
returns @tmpTable table (  
     fCode varchar(max) ,  
     Seq int identity(1,1)  
    )  
as  
begin  
    declare @strTmp varchar(max) ,  
        @Seq int  
    declare @Index int   
    declare @Index2 int   
  
    if (isnull(@strSplit2,'')='')  
    begin  
        while len(@strOri)>0  
        begin  
            set @Index=charindex(@strSplit,@strOri)  
  
            if @Index=0  
            begin  
                insert  into @tmpTable (fCode)  
                values  (@strOri)  
                set @strOri=''  
            end  
            else  
            begin  
                set @strTmp=substring(@strOri,1,@Index-1)  
                if @strTmp<>'' or @IfRetdEmpty=1  
                    insert  into @tmpTable (fCode)  
                    values  (@strTmp)  
                set @strOri=right(@strOri,len(@strOri)-@Index-len(@strSplit)+1)  
  
            end  
        end  
    end  
    else  
    begin  
        while len(@strOri)>0  
        begin  
            set @Index=charindex(@strSplit,@strOri)  
            set @strOri=right(@strOri,len(@strOri)-@Index-len(@strSplit)+1)  
            set @Index2=charindex(@strSplit2,@strOri)  
  
            if @Index=0 or @Index2=0  
            begin  
                set @strOri=''  
            end  
            else  
            begin  
                set @strTmp=substring(@strOri,1,@Index2-1)  
                if @strTmp<>'' or @IfRetdEmpty=1
                    insert  into @tmpTable (fCode)  
                    values  (@strTmp)  
                set @strOri=right(@strOri,len(@strOri)-@Index2-len(@strSplit2)+1)  
  
            end  
        end  
    end  
    return  
end



-------------------------------------------------------------------------------------------------------------------------------------------


拆分的反向是字符串连接

在Sql Server2005以上版本可以使用for xml path实现链接字符串的功能,下面是一个示例


select stuff((
select ','+CONVERT(VARCHAR(10),Id)
from (
	SELECT ID=1 
	UNION ALL 
	SELECT 2
	UNION ALL 
	SELECT 3
	UNION ALL 
	SELECT 4
	UNION ALL 
	SELECT 5
	UNION ALL 
	SELECT 6
) a
for xml path('')),1,1,'')



在没有SqlServer2000系统中没有for xml path这个xml转换写法,所以只能用比较原始的方法,如下:


DECLARE @IDList VARCHAR(MAX)
SET @IDList=''
select @IDList=@IDList+','+CONVERT(VARCHAR(10),Id)
from (
	SELECT ID=1 
	UNION ALL 
	SELECT 2
	UNION ALL 
	SELECT 3
	UNION ALL 
	SELECT 4
	UNION ALL 
	SELECT 5
	UNION ALL 
	SELECT 6
) a

SELECT RIGHT(@IDList,LEN(@IDList)-1)


你可能感兴趣的:(Sql,Server)