因为这个问题说什么的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
看看这些存储过程的例子为实现这一目标
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
我来到这里寻找同样的,并应用于保罗·迪克森的解决方案。
然而,我注意到,我们也有一些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
没有内置函数来做到这一点在MSSQL,但是转换ABCD到一个IP数的计算公式为:
IP数= A X(256 * 256 * 256)+ B X(256 * 256)+ C×256 + d
我可能会写的地方要做到这一点的SQL函数,虐待看看。
如果你正在寻找一个功能待办事项此尝试转换IP到大INT