将小数字符串转换为十进制

tmw*_*ods 0 sql sql-server casting

我有几列的值要么是小数字符串(即 6 11/32),要么是小数(1.5)。是否有一个CASTCONVERT调用可以将这些转换为始终为小数?

错误:

消息 8114,级别 16,状态 5,第 1 行将数据类型 varchar 转换为数字时出错。

我可以避免进行任何类型的解析吗?

谢谢!

PS我在工作SQL Server Management Studio 2012

小智 5

CREATE FUNCTION ufn_ConvertToNumber(@STR VARCHAR(50))
RETURNS decimal(18,10)
AS
BEGIN
        DECLARE @L VARCHAR(50) = ''
        DECLARE @A DECIMAL(18,10) = 0
        SET @STR = LTRIM(RTRIM(@STR)); -- Remove extra spaces
        IF ISNUMERIC(@STR) > 0 SET @A = CONVERT(DECIMAL(18,10), @STR) -- Check to see if already real number
        IF CHARINDEX(' ',@STR,0) > 0
        BEGIN
            SET @L = SUBSTRING(@STR,1,CHARINDEX(' ',@STR,0) - 1 )
            SET @STR = SUBSTRING(@STR,CHARINDEX(' ',@STR,0) + 1 ,50 )
            SET @A = CONVERT(DECIMAL(18,10), @L)
        END
        IF CHARINDEX('/',@STR,0) > 0
        BEGIN
            SET @L = SUBSTRING(@STR,1,CHARINDEX('/',@STR,0) - 1 )
            SET @STR = SUBSTRING(@STR,CHARINDEX('/',@STR,0) + 1 ,50 )
            SET @A =  @A + ( CONVERT(DECIMAL(18,10), @L) / CONVERT(DECIMAL(18,10), @STR)  )
        END
        RETURN @A
END
GO
Run Code Online (Sandbox Code Playgroud)

然后通过 select dbo.ufn_ConvertToNumber ('5 9/5') 访问它