- /*
- * 从字符创中截取数字部分,只截取第一个数字部分
- * 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
- --该片段来自于http://www.codesnippet.cn/detail/1901201614465.html
来源: http://www.codesnippet.cn/detail/1901201614465.html