2016-05-12 52 views
0

给定一个表具有以下IP地址TSQL转换地址列表CIDR标记

IPAddress 
----------- 
192.168.1.1 
192.168.1.2 
192.168.1.3 
192.168.1.4 
192.168.1.5 
192.168.1.6 
192.168.1.7 
192.168.1.8 

我找下面的输出

Output 
--------------- 
192.168.1.0/29 
192.168.1.8/32 

我来最接近的是与这个:

SELECT SUBSTRING(IPAddress, 1, LEN(IPAddress) - CHARINDEX('.',REVERSE(IPAddress))), COUNT(*) 
FROM IP 
GROUP BY SUBSTRING(IPAddress, 1, LEN(IPAddress) - CHARINDEX('.',REVERSE(IPAddress))) 

但是,只有我的子网和地址#。不知道如何采取下一步。

+0

我来最接近的是这个 SELECT SUBSTRING(ip地址,1,LEN(ip地址)CHARINDEX(,REVERSE(ip地址) )), COUNT(*) FROM IP GROUP BY SUBSTRING(ip地址,1,LEN(ip地址) - '' CHARINDEX(,REVERSE(ip地址))) – bitvector

+0

但只得到我的地址的子网和# 。不确定如何采取下一步 – bitvector

+0

你能否以简单的英语解释你想要的输出内容?恐怕,这并不是显而易见的。 –

回答

0

您需要使用子网掩码才能知道符号的正确数量的主机位。

这会给你CIDR: - ''

DECLARE @IPADDRESS VARCHAR(15) = '192.168.1.1' 
     ,@NETMASK VARCHAR(15) = '255.255.255.0' 
     ,@NETWORKBITS VARCHAR(3) 

SET @NETWORKBITS = 
    CASE 
     WHEN @NETMASK = '255.0.0.0' THEN '8' 
     WHEN @NETMASK = '255.128.0.0' THEN '9' 
     WHEN @NETMASK = '255.192.0.0' THEN '10' 
     WHEN @NETMASK = '255.224.0.0' THEN '11' 
     WHEN @NETMASK = '255.240.0.0' THEN '12' 
     WHEN @NETMASK = '255.248.0.0' THEN '13' 
     WHEN @NETMASK = '255.252.0.0' THEN '14' 
     WHEN @NETMASK = '255.254.0.0' THEN '15' 
     WHEN @NETMASK = '255.255.0.0' THEN '16' 
     WHEN @NETMASK = '255.255.128.0' THEN '17' 
     WHEN @NETMASK = '255.255.192.0' THEN '18' 
     WHEN @NETMASK = '255.255.224.0' THEN '19' 
     WHEN @NETMASK = '255.255.240.0' THEN '20' 
     WHEN @NETMASK = '255.255.248.0' THEN '21' 
     WHEN @NETMASK = '255.255.252.0' THEN '22' 
     WHEN @NETMASK = '255.255.254.0' THEN '23' 
     WHEN @NETMASK = '255.255.255.0' THEN '24' 
     WHEN @NETMASK = '255.255.255.128' THEN '25' 
     WHEN @NETMASK = '255.255.255.192' THEN '26' 
     WHEN @NETMASK = '255.255.255.224' THEN '27' 
     WHEN @NETMASK = '255.255.255.240' THEN '28' 
     WHEN @NETMASK = '255.255.255.248' THEN '29' 
     WHEN @NETMASK = '255.255.255.252' THEN '30' 
     WHEN @NETMASK = '255.255.255.254' THEN '31' 
     WHEN @NETMASK = '255.255.255.255' THEN '32' 
    END 
PRINT @IPADDRESS + '/' @NETWORKBITS 
+0

@bitvector请告诉你是否有子网掩码,如果你想要一个功能,所以我可以给你一个更好的答案。如果你没有子网掩码,这是不可能的。 – Tizechie

+0

嗨Tizechie,我拥有的唯一数据是IP地址。我很欣赏网络面具的功能,但似乎没有一个好方法来实现我的目标。 – bitvector

+0

@bitvector,在你的问题中,当你说你想输出192.168.1.0/29这只是简短的手192.168.1.0 255.255.255.248。也许你不是在问正确的问题?我很乐意为您解决问题,但您需要修改您的问题。 – Tizechie