if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_strtonum2]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[f_strtonum2]
GOCreate Function f_strtonum2 ( @str varchar(200)) Returns numeric(19,3)
WITH ENCRYPTION
AS
begin
declare @len int,@i int,@err int,@temp varchar(200),
@ret numeric(19,3),@tstr varchar(200)
select @len=0,@i=0,@ret=0,@err=0,@temp=''
if rtrim(@str)='' or @str is null
set @err=1
--数字,退出
if isnumeric(@str)=1 and @err=0
select @ret=cast(@str as numeric(19,3)),@err=1 if @err=0
begin
select @str=rtrim(@str),@len=len(rtrim(@str))
--
if isnumeric(left(@str,1))=1 and @err=0 and left(@str,1) not in('.',',','+','-')
begin
while @i<=@len
begin
select @i=@i+1,@tstr=left(@str,@i)
if isnumeric(@tstr)=0
begin
select @ret=cast(left(@tstr,@i-1) as numeric(19,3))
break
end
else
continue
end
set @err=1
end
end
return @ret
end
go[/code]
drop function [dbo].[f_strtonum2]
GOCreate Function f_strtonum2 ( @str varchar(200)) Returns numeric(19,3)
WITH ENCRYPTION
AS
begin
declare @len int,@i int,@err int,@temp varchar(200),
@ret numeric(19,3),@tstr varchar(200)
select @len=0,@i=0,@ret=0,@err=0,@temp=''
if rtrim(@str)='' or @str is null
set @err=1
--数字,退出
if isnumeric(@str)=1 and @err=0
select @ret=cast(@str as numeric(19,3)),@err=1 if @err=0
begin
select @str=rtrim(@str),@len=len(rtrim(@str))
--
if isnumeric(left(@str,1))=1 and @err=0 and left(@str,1) not in('.',',','+','-')
begin
while @i<=@len
begin
select @i=@i+1,@tstr=left(@str,@i)
if isnumeric(@tstr)=0
begin
select @ret=cast(left(@tstr,@i-1) as numeric(19,3))
break
end
else
continue
end
set @err=1
end
end
return @ret
end
go[/code]
解决方案 »
- SQL Server 内置函数创建
- 菜鸟求个时间段查询的问题请教
- 主键的标识列
- 求一个复杂的 分组比较求和 的SQL
- SQL SERVER 2005复制技术-查看快照代理状态提示“已以用户 db-server\repl_Snapshot 的身份执行。 客户端没有所需的特权。.”
- 高手快来:如何用Sql知道Northwind中有什么表?
- 请教一个按时间查询问题!
- 关于设置主键!!!!
- 发蒙求救,sqlservr.exe是否病毒
- 从SQL Server转到ACCESS2000遇到的两个难题,请各位帮帮忙,谢谢了
- sql 语句查询问题(简单的查询)在线等
- 如何将相关表的Code字段的值的串改为Name的串呢,多谢了!
create function f_str(@str varchar(400))
returns numeric(12,2)
as
begin
while patindex('%[^0-9]%',@str)>0
begin
set @str = stuff( @str, patindex('%[^0-9]%',@str) ,1 ,'')
end
return cast(@str as numeric(12,2))
end
goselect dbo.f_str('saf123asd234')
drop function f_str/*
--------------
123234.00(所影响的行数为 1 行)
*/
但是碰到如下一些传入字符串时,会出错或者结果不正确,想请大家帮忙看看该怎么修改好或者重写。谢谢传入字符 得到结果 希望得到结果
+ 出错 0.000
, 出错 0.000
. 出错 0.000
- 出错 0.000
,, 出错 0.000
-123.2cbm 0.000 -123.200
+123.2cbm 0.000 123.200
例如: "-fasd1343s-43" or "4ds+r46-as4" ..?
+ 出错 0.000
, 出错 0.000
. 出错 0.000
- 出错 0.000
,, 出错 0.000
-123.2cbm 0.000 -123.200
+123.2cbm 0.000 123.200
create function GetNumbers(@var varchar(50))
returns numeric(12,3)
as
begin
declare @num varchar(50)
set @num=''
if(patindex('%[0-9]%',@var)=0)
set @num='0'
else
begin
while(patindex('%[0-9]%',@var)>0)
begin
set @num=@num+substring(@var,patindex('%[0-9.+-]%',@var),1)
set @var=stuff(@var,patindex('%[0-9.+-]%',@var),1,'')
end
end
return cast(@num as numeric(12,3))
end
go--测试
select dbo.GetNumbers('+')
select dbo.GetNumbers(',')
select dbo.GetNumbers('.')
select dbo.GetNumbers('-')
select dbo.GetNumbers('-123.2cbm')
select dbo.GetNumbers('+123.2cbm')
select dbo.GetNumbers('+123sas3.2cbm')
--考虑到四楼说的情况,将函数完善一下(主要包括多符号时,以及符号在数字后面等情况。)
create function GetNumbers(@var varchar(50))
returns numeric(12,3)
as
begin
declare @num varchar(50)
set @num=''
if(patindex('%[0-9]%',@var)=0)
set @num='0'
else
begin
while(patindex('%[0-9.+-]%',@var)>0)
begin
if(substring(@var,patindex('%[0-9.+-]%',@var),1) in (',','+','-') and (patindex('%[.+-]%',@num)>0 or patindex('%[0-9]%',@num)>0))
begin
set @var=stuff(@var,patindex('%[0-9.+-]%',@var),1,'')
continue;
end
else
begin
set @num=@num+substring(@var,patindex('%[0-9.+-]%',@var),1)
set @var=stuff(@var,patindex('%[0-9.+-]%',@var),1,'')
end
end
end
return cast(@num as numeric(12,3))
end--测试
select dbo.GetNumbers('+')
select dbo.GetNumbers(',')
select dbo.GetNumbers('.')
select dbo.GetNumbers('-')
select dbo.GetNumbers('-123.2cbm')
select dbo.GetNumbers('+123.2cbm')
select dbo.GetNumbers('+123sas3.2cbm')
select dbo.GetNumbers('123sas3+.2cbm')
select dbo.GetNumbers('+123s-as3.+2cbm')