2011-07-15 24 views
0

文字列をbigintに変換する関数を作成します。変換が不可能な場合、関数はnullを返す必要があります。私は、機能が正常な表現(例えば、「10000」)のために仕事をしたいと仮数・指数表現(「1E1 + 10」)がここで私はこれまでに書かれたものです:ときに私varcharをbigint関数に変換する

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を返すことです。 変換に前提条件を入れてもはや落ちないようにするにはどうすればよいですか?

呼び出し例:select dbo.udf_get_bigint( '3e0210') 出力:式をデータ型realに変換する算術オーバーフローエラー。

答えて

3

実数ではなく浮動小数点数を使用します。これは、変数名と矛盾するかもしれませんが、このコードは、検証するスクリプトの作業

declare @real float 

のその部分を作る

select CONVERT(float,'3e0210') 
+0

も ​​''(floatとして「3e0210」)キャストを行うことができます – Manatherin

関連する問題