我想创建一个将字符串转换为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的算术溢出错误。
答案 0 :(得分:3)
使用float而不是real。它可能与变量名称相矛盾,但它使脚本的一部分工作
declare @real float
此代码将验证
select CONVERT(float,'3e0210')