将varchar转换为bigint函数

时间:2011-07-15 06:09:42

标签: tsql

我想创建一个将字符串转换为bigint的函数。如果转换不可能,则函数应返回null。我希望函数适用于正常表示(例如'10000')和尾数指数表示('1e1 + 10')这是我到目前为止所写的:

ALTER FUNCTION [dbo].[udf_get_bigint]    
(  
 @character varchar(100)  
)  
RETURNS bigint  

AS  
BEGIN  

    if ISNUMERIC(@character)=0 return null
    if LEN(ltrim(rtrim(@character)))>25 return null
    declare @nr numeric(25,4)
    if charindex('e',lower(@character))>0   
    begin
        declare @real real

        **set @nr=CONVERT(real,@character)**
        if  @nr not between convert(numeric(25),-9223372036854775808) and 
               convert(numeric(25),9223372036854775807) 
                return null
        set @real = convert(real, @nr)
        return convert(bigint,convert(numeric(25),@real))

    end
    else
        set @nr=CONVERT(numeric(25,4),@character)
        if  @nr between convert(numeric(25),-9223372036854775808) and 
          convert(numeric(25),9223372036854775807) return convert(bigint,@nr)
                 return null
END  

现在,当我需要处理尾数指数表示的溢出时,唯一的问题出现了。在溢出的情况下,加粗转换;但我想要它做的是返回null。 我怎样才能在转换中加入一些先决条件,使其不再失效。

调用示例:选择dbo.udf_get_bigint('3e0210') output:将表达式转换为数据类型real的算术溢出错误。

1 个答案:

答案 0 :(得分:3)

使用float而不是real。它可能与变量名称相矛盾,但它使脚本的一部分工作

declare @real float

此代码将验证

select CONVERT(float,'3e0210')