在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)