由网上查找,根据工作需要进行修改
1.[代码][SQL]代码
/*
* 从字符创中截取数字部分,只截取第一个数字部分
* a2b3c4 只截取 2
*/
alter function dbo.f_GetNumInStr
(@Str varchar(200))
returns varchar(50)
as
begin
declare @Result varchar(50)
set @Result = ''
select @Str = LTRim(RTrim(@Str))
declare @i as int
declare @j as int
declare @k1 as int
declare @k2 as int
set @i = 1 --循环开始位置
set @j = len(@Str) --循环结束位置
set @k1 = 0 --记录数字开始的位置
set @k2 = 0 --记录数字结束的位置
while @i <= @j and isnull(@Result,'') = '' --在结束位置前,且未取到数字
begin
--判断当前位置是否为数字
if (substring(@Str , @i , 1) between '0' and '9') or (substring(@Str , @i , 1) = '.') or (substring(@Str , @i , 1) = '%')
or (substring(@Str , @i , 1) = '+') or (substring(@Str , @i , 1) = '-') --允许判断小数
begin
if @k1 = 0 --如果是第一次取到数字,即为数字开始位置
set @k1 = @i
if @i = @j --已循环到最后位置
begin
set @k2 = @j --最后位置是数字
set @Result = substring(@Str , @k1 , (@k2 - @k1 + 1)) --根据开始和结束位置获取数字
end
end
else --当前位置非数字部分
begin
if @k1 > 0 --如果已取到开始位置
begin
set @k2 = @i - 1 --上一个位置为数字部分结束
set @Result = substring(@Str , @k1 , (@k2 - @k1 + 1))
end
--取到非数字,一次取值结束,初始化数字位置
set @k1 = 0
set @k2 = 0
end
--向后一位取数
set @i = @i + 1
end
return @Result
end