Efficient ISNUMERIC() replacements on SQL Server?

后端 未结 11 2075
失恋的感觉
失恋的感觉 2020-11-27 06:02

So I just spent 5 hours troubleshooting a problem which turned out to be due not only to the old unreliable ISNUMERIC but it looks like my problem only appears

11条回答
  •  感动是毒
    2020-11-27 07:02

    How about implementing these two functions:

    CREATE FUNCTION dbo.isReallyNumeric  
    (  
        @num VARCHAR(64)  
    )  
    RETURNS BIT  
    BEGIN  
        IF LEFT(@num, 1) = '-'  
            SET @num = SUBSTRING(@num, 2, LEN(@num))  
    
        DECLARE @pos TINYINT  
    
        SET @pos = 1 + LEN(@num) - CHARINDEX('.', REVERSE(@num))  
    
        RETURN CASE  
        WHEN PATINDEX('%[^0-9.-]%', @num) = 0  
            AND @num NOT IN ('.', '-', '+', '^') 
            AND LEN(@num)>0  
            AND @num NOT LIKE '%-%' 
            AND  
            (  
                ((@pos = LEN(@num)+1)  
                OR @pos = CHARINDEX('.', @num))  
            )  
        THEN  
            1  
        ELSE  
        0  
        END  
    END  
    GO  
    
    CREATE FUNCTION dbo.isReallyInteger  
    (  
        @num VARCHAR(64)  
    )  
    RETURNS BIT  
    BEGIN  
        IF LEFT(@num, 1) = '-'  
            SET @num = SUBSTRING(@num, 2, LEN(@num))  
    
        RETURN CASE  
        WHEN PATINDEX('%[^0-9-]%', @num) = 0  
            AND CHARINDEX('-', @num) <= 1  
            AND @num NOT IN ('.', '-', '+', '^') 
            AND LEN(@num)>0  
            AND @num NOT LIKE '%-%' 
        THEN  
            1  
        ELSE  
            0  
        END  
    END  
    GO
    

    Original Source

提交回复
热议问题