What is the SQL Server equivalent of INET_ATON

前端 未结 3 1825
渐次进展
渐次进展 2021-02-10 06:18

As the question says what is the SQL Server equivalent of INET_ATON from mySql. The reason I need this is because i imported a IP data base from http://ipinfodb.com

3条回答
  •  盖世英雄少女心
    2021-02-10 06:57

    Take a look at these stored procedure examples for achieving this

    CREATE FUNCTION dbo.ipStringToInt 
    ( 
        @ip CHAR(15) 
    ) 
    RETURNS INT 
    AS 
    BEGIN 
        DECLARE @rv INT, 
            @o1 INT, 
            @o2 INT, 
            @o3 INT, 
            @o4 INT, 
            @base INT 
    
        SELECT 
            @o1 = CONVERT(INT, PARSENAME(@ip, 4)), 
            @o2 = CONVERT(INT, PARSENAME(@ip, 3)), 
            @o3 = CONVERT(INT, PARSENAME(@ip, 2)), 
            @o4 = CONVERT(INT, PARSENAME(@ip, 1)) 
    
        IF (@o1 BETWEEN 0 AND 255) 
            AND (@o2 BETWEEN 0 AND 255) 
            AND (@o3 BETWEEN 0 AND 255) 
            AND (@o4 BETWEEN 0 AND 255) 
        BEGIN      
            SELECT @base = CASE 
                WHEN @o1 < 128 THEN 
                    (@o1 * 16777216) 
                ELSE 
                    -(256 - @o1) * 16777216 
                END 
    
            SET @rv = @base +  
                (@o2 * 65536) +  
                (@o3 * 256) + 
                (@o4) 
        END 
        ELSE 
            SET @rv = -1 
        RETURN @rv 
    END
    

    Example usage

    INSERT mytable VALUES(dbo.ipStringToInt('1.2.3.4'))
    

    If you want to reverse that and turn an integer into a dotted-quad, try this

    CREATE FUNCTION dbo.ipIntToString 
    ( 
        @ip bigINT 
    ) 
    RETURNS CHAR(15) 
    AS 
    BEGIN 
        DECLARE @o1 bigINT, 
            @o2 bigINT, 
            @o3 bigINT, 
            @o4 bigINT 
    
        IF ABS(@ip) > 4294967295 
            RETURN '255.255.255.255' 
    
        SET @o1 = @ip / 16777216 
    
        IF @o1 = 0 
            SELECT @o1 = 255, @ip = @ip + 16777216 
    
        ELSE IF @o1 < 0 
        BEGIN 
            IF @ip % 16777216 = 0 
                SET @o1 = @o1 + 256 
            ELSE 
            BEGIN 
                SET @o1 = @o1 + 255 
                IF @o1 = 128 
                    SET @ip = @ip + 2147483648 
                ELSE 
                    SET @ip = @ip + (16777216 * (256 - @o1)) 
            END 
        END 
        ELSE 
        BEGIN 
            SET @ip = @ip - (16777216 * @o1) 
        END 
    
        SET @ip = @ip % 16777216 
        SET @o2 = @ip / 65536 
        SET @ip = @ip % 65536 
        SET @o3 = @ip / 256 
        SET @ip = @ip % 256 
        SET @o4 = @ip 
    
        RETURN 
            CONVERT(VARCHAR(4), @o1) + '.' + 
            CONVERT(VARCHAR(4), @o2) + '.' + 
            CONVERT(VARCHAR(4), @o3) + '.' + 
            CONVERT(VARCHAR(4), @o4) 
    END
    

提交回复
热议问题