还可以: /* 取出字符串中间的数字(第二版)*/ create function [dbo].[m_getnumberV2.0] ( @mysql_one nvarchar(200) ) returns varchar(200) begin declare @mysql_two varchar(200) declare @sql_one int declare @sql_two int select @sql_one= patindex('%[0-9.]%',@mysql_one) select @sql_two= patindex('%[^0-9.]%', substring(@mysql_one,patindex('%[0-9.]%',@mysql_one),len(@mysql_one)-patindex('%[0-9.]%',@mysql_one)+1)) if @sql_two=0 begin select @mysql_two= substring (@mysql_one,@sql_one,len(@mysql_one)+1-@sql_one) end else begin select @mysql_two=substring (@mysql_one,@sql_one,@sql_two-1) end return @mysql_two; end
IF OBJECT_ID('tempdb..#temp') IS NOT NULL DROP TABLE #temp goCREATE TABLE #temp(F1 varchar(100)) INSERT #temp SELECT 'A123' UNION ALL SELECT 'AB345' UNION ALL SELECT 'C111B' UNION ALL SELECT 'AB'--截取第一段出现的数字串: SELECT F1=SUBSTRING(F1,1,CASE WHEN PATINDEX('%[^0-9]%', F1) = 0 THEN LEN(F1) ELSE PATINDEX('%[^0-9]%', F1)-1 END) FROM ( SELECT F1=SUBSTRING(F1,PATINDEX('%[0-9]%', F1),LEN(F1)) FROM #temp WHERE PATINDEX('%[0-9]%', F1) > 0 ) T /* F1 123 345 111 */
create function [dbo].[get_number] (@s1 nvarchar(200)) return vchar(200) begin declare @s2 vchar(200) declare @s3 vchar(200) declare @i int select @i=1 select @s3='' loop: select @s2=substring(@s1,@i,1) if @s2 like '[0-9]' select @s3=@s3+@s2 end if select @i=@i+1 if @i<=len(@s1) goto loop end
(
@mysql_one nvarchar(200)
)
returns varchar(200)
begin
declare @mysql_two varchar(200)
select @mysql_two=
substring(@mysql_one,patindex('%[0-9.]%',@mysql_one),patindex('%[^0-9.]%',substring(@mysql_one,patindex('%[0-9.]%',@mysql_one),
len(@mysql_one)-patindex('%[0-9.]%',@mysql_one)+1))-1)
return @mysql_two;
end
--测试
select dbo.[m_getchinese]('China2009中国HRB4-1v')
select dbo.[m_getstr]('China2009中国HRB4-1v')
select dbo.[m_getnumber]('China2009中国HRB4-1v')
/* 取出字符串中间的数字(第二版)*/
create function [dbo].[m_getnumberV2.0]
(
@mysql_one nvarchar(200)
)
returns varchar(200)
begin
declare @mysql_two varchar(200)
declare @sql_one int
declare @sql_two int
select @sql_one= patindex('%[0-9.]%',@mysql_one)
select @sql_two=
patindex('%[^0-9.]%',
substring(@mysql_one,patindex('%[0-9.]%',@mysql_one),len(@mysql_one)-patindex('%[0-9.]%',@mysql_one)+1))
if @sql_two=0
begin
select @mysql_two= substring (@mysql_one,@sql_one,len(@mysql_one)+1-@sql_one)
end
else
begin
select @mysql_two=substring (@mysql_one,@sql_one,@sql_two-1)
end
return @mysql_two;
end
--测试示例
select dbo.[m_getnumberV2.0] ('字段.456A(AA)A')--正常
select dbo.[m_getnumberV2.0] ('CHinese2.1day')--正常
select dbo.[m_getnumberV2.0] ('Name5.01From')--正常
select dbo.[m_getnumberV2.0] ('9898Address')--正常
select dbo.[m_getnumberV2.0] ('aaaaaForm2.3333')--正常
goCREATE TABLE #temp(F1 varchar(100))
INSERT #temp
SELECT 'A123' UNION ALL
SELECT 'AB345' UNION ALL
SELECT 'C111B' UNION ALL
SELECT 'AB'--截取第一段出现的数字串:
SELECT F1=SUBSTRING(F1,1,CASE WHEN PATINDEX('%[^0-9]%', F1) = 0 THEN LEN(F1) ELSE PATINDEX('%[^0-9]%', F1)-1 END)
FROM
(
SELECT F1=SUBSTRING(F1,PATINDEX('%[0-9]%', F1),LEN(F1))
FROM #temp
WHERE PATINDEX('%[0-9]%', F1) > 0
) T
/*
F1
123
345
111
*/
create function [dbo].[get_number]
(@s1 nvarchar(200))
return vchar(200)
begin
declare @s2 vchar(200)
declare @s3 vchar(200)
declare @i int
select @i=1
select @s3=''
loop:
select @s2=substring(@s1,@i,1)
if @s2 like '[0-9]'
select @s3=@s3+@s2
end if
select @i=@i+1
if @i<=len(@s1)
goto loop
end