create table ta( col varchar(100)) insert ta select 'aa/bb/cc/dd/ee/ff' union all select 'aaa/bbb/ccc/ddd/eee/ff/ggg'go--加一个分隔函数: create function F_split( @s varchar(8000), --包含多个数据项的字符串 @pos int, --要获取的数据项的位置 @split varchar(10) --数据分隔符 )RETURNS varchar(100) AS BEGIN IF @s IS NULL RETURN(NULL) DECLARE @splitlen int --分隔符长度 SELECT @splitlen=LEN(@split+'a')-2 WHILE @pos>1 AND charindex(@split,@s+@split)>0 SELECT @pos=@pos-1, @s=stuff(@s,1,charindex(@split,@s+@split)+@splitlen,'') RETURN(nullif(left(@s,charindex(@split,@s+@split)-1),'')) END GOselect dbo.F_split(col,1,'/'),dbo.F_split(col,3,'/'),dbo.F_split(col,5,'/') from tadrop table ta drop function F_split
--加一个分隔函数: create function F_split( @s varchar(8000), --包含多个数据项的字符串 @pos int, --要获取的数据项的位置 @split varchar(10) --数据分隔符 )RETURNS varchar(100) AS BEGIN IF @s IS NULL RETURN(NULL) DECLARE @splitlen int --分隔符长度 SELECT @splitlen=LEN(@split+'a')-2 WHILE @pos>1 AND charindex(@split,@s+@split)>0 SELECT @pos=@pos-1, @s=stuff(@s,1,charindex(@split,@s+@split)+@splitlen,'') RETURN(nullif(left(@s,charindex(@split,@s+@split)-1),'')) END GO declare @str varchar(30) set @str = '1/2/3/4/5' select dbo.F_split(@str,4,'/') drop function F_split /* ----------- 4(1 行受影响) */
我自己写的一个函数,一劳永逸 --根据分隔符获取字符串中的一部分字符串 ALTER FUNCTION [dbo].[fn_SplitString] ( @FullString as nvarchar(4000), --整体字符串 @SplitChar as nvarchar(10), --分隔符 @Index as int, --第几个,从1开始 @Maxlenth as int=null --最大长度,如果是0或null,则不限制长度。 ) RETURNS nvarchar(4000) AS BEGIN if @FullString is null or @SplitChar is null or @SplitChar ='' return null; if ltrim(@FullString) = '' return ''; declare @site int; declare @n int; declare @result nvarchar(2000);
set @n=0; set @site =0 ; while (@n< @Index) begin set @n= @n+1; set @site=charindex(@SplitChar,@FullString); if @site=0 begin set @result=@FullString; set @FullString=''; end else begin set @result=substring(@FullString,1,@site-1); set @FullString=substring(@FullString,@site+1,len(@FullString)-@site) ; end
end if @Maxlenth>0 and len(@result) > @Maxlenth set @result = substring(@result,1,@Maxlenth); return @result;
END 使用方法: select [dbo].[fn_SplitString]('1/2/3/4/5','/',4,0);以后别的地方也可以用
insert ta select
'aa/bb/cc/dd/ee/ff' union all select
'aaa/bbb/ccc/ddd/eee/ff/ggg'go--加一个分隔函数:
create function F_split(
@s varchar(8000), --包含多个数据项的字符串
@pos int, --要获取的数据项的位置
@split varchar(10) --数据分隔符
)RETURNS varchar(100)
AS
BEGIN
IF @s IS NULL RETURN(NULL)
DECLARE @splitlen int --分隔符长度
SELECT @splitlen=LEN(@split+'a')-2
WHILE @pos>1 AND charindex(@split,@s+@split)>0
SELECT @pos=@pos-1,
@s=stuff(@s,1,charindex(@split,@s+@split)+@splitlen,'')
RETURN(nullif(left(@s,charindex(@split,@s+@split)-1),''))
END
GOselect dbo.F_split(col,1,'/'),dbo.F_split(col,3,'/'),dbo.F_split(col,5,'/')
from tadrop table ta
drop function F_split
create function F_split(
@s varchar(8000), --包含多个数据项的字符串
@pos int, --要获取的数据项的位置
@split varchar(10) --数据分隔符
)RETURNS varchar(100)
AS
BEGIN
IF @s IS NULL RETURN(NULL)
DECLARE @splitlen int --分隔符长度
SELECT @splitlen=LEN(@split+'a')-2
WHILE @pos>1 AND charindex(@split,@s+@split)>0
SELECT @pos=@pos-1,
@s=stuff(@s,1,charindex(@split,@s+@split)+@splitlen,'')
RETURN(nullif(left(@s,charindex(@split,@s+@split)-1),''))
END
GO
declare @str varchar(30)
set @str = '1/2/3/4/5' select dbo.F_split(@str,4,'/')
drop function F_split
/*
-----------
4(1 行受影响)
*/
--如果你的"/"固定是4个的话,还可以这样:declare @s varchar(100)set @s = '1/2/3/4/5' set @s = replace(stuff(@s,1,charindex('/',@s),''),'/','.')select parsename(replace(@s,'/','.'),2)
功能:将字符串插入另一字符串。它在第一个字符串中从开始位置删除指定长度的字,然后将第二个字符串插入第一个字符串的开始位置。
Character_expression1:一个要被插入字符串的字符串表达式。可以是常量、变量,也可以是字符列或二进制数据列。
start:一个整数,指定删除和插入的开始位置。
length:一个整数,指定要删除的字符数。示例:
declare @s varchar(50)
set @s = '123456789'
--将'23456'删除后插入'哈哈'
select stuff(@s,2,5,'哈哈') as 代替字符串结果:
代替字符串
-----------------------
'1哈哈789'⒊CHARINDEX(expression1,expression2 [,start_location])
功能:在expression2中搜索expression1并返回其起始位置,搜索的开始位置为start_location。
expression1:要查找的字符表达式。最大长度为8000字符。
expression2:要搜索的字符表达式。
start_location:可选项,表示搜索的起始位置。示例:
declare @s varchar(50)
set @s = '1234567859'
--从第位开始搜索'5',并返回其在字符串中所在位置
select charindex('5',@s,8) as 位置
-
结果:
位置
-----------------------
9
--修正个多余的语句:declare @s varchar(100)set @s = '1/2/3/4/5' set @s = replace(stuff(@s,1,charindex('/',@s),''),'/','.')select parsename(@s,2)/**
4
**/
--根据分隔符获取字符串中的一部分字符串
ALTER FUNCTION [dbo].[fn_SplitString]
(
@FullString as nvarchar(4000), --整体字符串
@SplitChar as nvarchar(10), --分隔符
@Index as int, --第几个,从1开始
@Maxlenth as int=null --最大长度,如果是0或null,则不限制长度。
)
RETURNS nvarchar(4000)
AS
BEGIN
if @FullString is null or @SplitChar is null or @SplitChar ='' return null;
if ltrim(@FullString) = '' return '';
declare @site int;
declare @n int;
declare @result nvarchar(2000);
set @n=0;
set @site =0 ;
while (@n< @Index)
begin
set @n= @n+1;
set @site=charindex(@SplitChar,@FullString);
if @site=0
begin
set @result=@FullString;
set @FullString='';
end
else
begin
set @result=substring(@FullString,1,@site-1);
set @FullString=substring(@FullString,@site+1,len(@FullString)-@site) ;
end
end
if @Maxlenth>0 and len(@result) > @Maxlenth
set @result = substring(@result,1,@Maxlenth); return @result;
END
使用方法:
select [dbo].[fn_SplitString]('1/2/3/4/5','/',4,0);以后别的地方也可以用