首页 文章

什么是INET_ATON的SQL Server等价物

提问于
浏览
5

正如问题所说,mySql的SQL Server等效于 INET_ATON . 我需要这个的原因是因为我从http://ipinfodb.com/ip_database.php导入了一个IP数据库到SQL Server 2005,并希望现在查询表 . 但根据他们的例子,我不知道该怎么做 .

INET_ATON(expr)给定网络地址的虚线四边形表示为字符串,返回表示地址数值的整数 . 地址可以是4或8字节地址 . mysql> SELECT INET_ATON('209.207.224.40');

  • 3520061480

4 回答

  • 3

    为实现这一目标,请查看这些stored procedure examples

    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
    

    用法示例

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

    如果要将其反转并将整数转换为点四边形,请尝试此操作

    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
    
  • 0

    我来到这里寻找同样的东西,并应用了Paul Dixon的解决方案 .

    但是,我注意到我们也有一些IPv6地址,所以我稍微改了一下:

    CREATE FUNCTION [dbo].[ip2int]
    (
        @ip VARCHAR(15) 
    )
    RETURNS INT
    AS
    BEGIN
    DECLARE @rv INT, 
            @o1 INT, 
            @o2 INT, 
            @o3 INT, 
            @o4 INT, 
            @base INT 
    
    IF ISNUMERIC(PARSENAME(@ip, 4) + '.0e0') =0 OR ISNUMERIC(PARSENAME(@ip, 3) + '.0e0') =0 OR ISNUMERIC(PARSENAME(@ip, 2) + '.0e0') =0 OR ISNUMERIC(PARSENAME(@ip, 1) + '.0e0') =0
        BEGIN
            set @rv = -2
        END
    ELSE
        BEGIN
        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 
        END
        RETURN @rv 
    
    END
    
  • 0

    在MSSQL中没有内置函数来执行此操作,但是将A.B.C.D转换为IP编号的公式为:

    IP号= A x(256 * 256 * 256)B x(256 * 256)C x 256 D.

    我可能已经在某处写了sql函数来做这件事,生病了 .

  • 5

    如果你正在寻找一个功能todo这试试convert ip to big int

相关问题