什么是SQL服务器相当于INET_ATON的(What is the SQL Server equi

2019-08-01 03:23发布

因为这个问题说什么的SQL服务器相当于INET_ATON从MySQL。 我需要这样做的原因是因为我进口从IP数据库http://ipinfodb.com/ip_database.php到SQL Server 2005,并且希望立即查询表。 但根据他们的榜样,我不知道该怎么做。

INET_ATON(表达式)

给定的网络地址作为字符串的点分表示,返回表示该地址的数值的整数。 地址可以是4或8个字节的地址。

 mysql> SELECT INET_ATON('209.207.224.40'); -> 3520061480 

Answer 1:

看看这些存储过程的例子为实现这一目标

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


Answer 2:

我来到这里寻找同样的,并应用于保罗·迪克森的解决方案。

然而,我注意到,我们也有一些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


Answer 3:

没有内置函数来做到这一点在MSSQL,但是转换ABCD到一个IP数的计算公式为:

IP数= A X(256 * 256 * 256)+ B X(256 * 256)+ C×256 + d

我可能会写的地方要做到这一点的SQL函数,虐待看看。



Answer 4:

如果你正在寻找一个功能待办事项此尝试转换IP到大INT



文章来源: What is the SQL Server equivalent of INET_ATON