MSSQL IP地址更新为二进制(32)

时间:2018-09-04 09:22:04

标签: tsql sql-server-2008 ip-address

我无法将我的IP地址(在表中为varchar)转换为二进制(32)格式

我有桌子

NETWORKS
Network_IP    Network_IP_in_binary   subnet_of_IP   subnet_of_IP_in_binary
24.55.186.203     NULL                    23           NULL
24.55.185.203     NULL                    45           NULL
24.55.184.203     NULL                    74           NULL
24.55.181.203     NULL                    45           NULL
24.55.183.203     NULL                    78           NULL
...                ...                    ...           ...

选择/功能/更新

--DECLARE @ipd as varchar(200)
--SET @ipd = (SELECT [Network_IP] FROM [Database].[dbo].[Networks] WHERE [Network_IP] = @IPd)

declare @ip varchar(200)
declare @address varchar(200)
set @address = 
--@ipd  
'24.55.186.203'
set @ip = parsename(@address,1)
DECLARE @Binary   VARCHAR(200)
SET @Binary = ''

   WHILE @IP <> 0
   BEGIN
      SET @Binary = SUBSTRING('0123456789', (@IP % 2) + 1, 1) + @Binary
      SET @IP = @IP / 2
   END

SET @IP = parsename(@address,2)

   WHILE @IP <> 0
   BEGIN
      SET @Binary = SUBSTRING('0123456789', (@IP % 2) + 1, 1) + @Binary
      SET @IP = @IP / 2
   END

SET @IP = parsename(@address,3)

   WHILE @IP <> 0
   BEGIN
      SET @Binary = SUBSTRING('0123456789', (@IP % 2) + 1, 1) + @Binary
      SET @IP = @IP / 2
   END

SET @IP = parsename(@address,4)
   WHILE @IP <> 0
   BEGIN
      SET @Binary = SUBSTRING('0123456789', (@IP % 2) + 1, 1) + @Binary
      SET @IP = @IP / 2
   END

SELECT right('000000000000000000000000000000' + cast(@Binary as varchar),30)

我需要这样的表,但是

  1. 我无法为多个地址设置选择或更新的声明

  2. 然后我无法弄清表网络的更新

  3. 然后我无法将IP地址的子网转换为二进制格式

  4. 我最后失败的是更新表网络并将二进制格式设置为右列。

NETWORKS
Network_IP           Network_IP_in_binary           subnet_of_IP         subnet_of_IP_in_binary
24.55.186.203     000110001101111011101111001011        23           000110001101111011101111001011
24.55.185.203     000110001101111011101111001011        45           000110001101111011101111001011
24.55.184.203     000110001101111011101111001011        74           000110001101111011101111001011
24.55.181.203     000110001101111011101111001011        45           000110001101111011101111001011
24.55.183.203     000110001101111011101111001011        78           000110001101111011101111001011
     ...                    ...                        ...                      ...

我在网站上阅读了文章:

但是我无法从中找出更新。

1 个答案:

答案 0 :(得分:0)

尽管我同意Panagiotis的评论以及您所链接的问题中可接受的答案(即,将IP存储为binary(4)而不是文本),但您可能无法决定这些事情(我看到了很多有关如何使用即使修改设计可以解决所有问题也无法更改的数据库的问题)- 因此,要将IPv4地址转换为二进制值的字符串表示形式,可以使用一系列位操作为IP地址的4个部分中的每个部分创建该字符串:

CREATE FUNCTION TinyIntToBinaryString(@value tinyint)
RETURNS CHAR(8)
AS
BEGIN

    RETURN CAST(SIGN(@value & 128) as char(1)) +
           CAST(SIGN(@value & 64) as char(1)) +
           CAST(SIGN(@value & 32) as char(1)) + 
           CAST(SIGN(@value & 16) as char(1)) +
           CAST(SIGN(@value & 8) as char(1)) +
           CAST(SIGN(@value & 4) as char(1)) +
           CAST(SIGN(@value & 2) as char(1)) +
           CAST(SIGN(@value & 1)  as char(1)) 
END

这将返回0到255之间任何数字的二进制值的字符串表示形式-因此3将返回00000011,而174将返回10101110。 / p>

现在有了它,您可以使用它来将整个IP地址转换为二进制字符串表示形式:

DECLARE @IP varchar(15) = '24.55.186.203'

SELECT dbo.TinyIntToBinaryString(PARSENAME(@IP, 4)) +
       dbo.TinyIntToBinaryString(PARSENAME(@IP, 3)) +
       dbo.TinyIntToBinaryString(PARSENAME(@IP, 2)) +
       dbo.TinyIntToBinaryString(PARSENAME(@IP, 1))

将得到00011000001101111011101011001011

的结果

当然,您可以创建一个函数,该函数将为您转换整个IP字符串表示形式-我将由您自行编写。