IP to Numeric

To followup on my previous post about doing ip to numeric address conversions. It turns out that the sql functions I linked to didn’t quite work, they were written with the assumption that you were storing the data as an INT rather than a BIGINT, so for values over 127.0.0.1 it would store the number as a negative number in the database. My source data uses bigint so I got errors back when feeding in data that overflowed the int.

If you are interested I have included the edited functions after the link

drop function dbo.ipStringToInt
go

CREATE FUNCTION dbo.ipStringToInt
(
    @ip CHAR(15)
)
RETURNS bigINT
AS
BEGIN
    DECLARE @rv bigINT,
        @o1 bigINT,
        @o2 bigINT,
        @o3 bigINT,
        @o4 bigINT,
        @base bigINT 

    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
		SET @rv = (@o1 * 16777216)+
            (@o2 * 65536) +
            (@o3 * 256) +
            (@o4)
    END
    ELSE
        SET @rv = -1
    RETURN @rv
END
go

drop function dbo.ipIntToString
go

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

Leave a Reply

OpenID

Anonymous