我无法将我的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)
我需要这样的表,但是
我无法为多个地址设置选择或更新的声明
然后我无法弄清表网络的更新
然后我无法将IP地址的子网转换为二进制格式
我最后失败的是更新表网络并将二进制格式设置为右列。
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
... ... ... ...
我在网站上阅读了文章:
但是我无法从中找出更新。
答案 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字符串表示形式-我将由您自行编写。