Sql server 2012 如何对SQL Server二进制列类型执行CIDR查询

Sql server 2012 如何对SQL Server二进制列类型执行CIDR查询,sql-server-2012,ip-address,bitwise-operators,binary-data,cidr,Sql Server 2012,Ip Address,Bitwise Operators,Binary Data,Cidr,我需要以这样的方式存储IPv6和IPv4地址,它们可以在SQL Server数据库中或多或少地使用CIDR表示法进行排序和搜索。我打算使用二进制(16),IPv4编码为IPv4-mapped-IPv6,因此任何一个IP地址都有一个一致的表示形式。我可以导出二进制形式的适当网络掩码以提供给查询。但是,当一个操作数是数字时,SQL Server只能执行位操作。显然,我不能用二进制(16)和128位值来做按位“&” 我意识到我可以读取每一行并在代码中执行此操作,但我需要在DB中执行此搜索,因为有几百万

我需要以这样的方式存储IPv6和IPv4地址,它们可以在SQL Server数据库中或多或少地使用CIDR表示法进行排序和搜索。我打算使用二进制(16),IPv4编码为IPv4-mapped-IPv6,因此任何一个IP地址都有一个一致的表示形式。我可以导出二进制形式的适当网络掩码以提供给查询。但是,当一个操作数是数字时,SQL Server只能执行位操作。显然,我不能用二进制(16)和128位值来做按位“&”

我意识到我可以读取每一行并在代码中执行此操作,但我需要在DB中执行此搜索,因为有几百万个IP可供搜索。我看过大多数关于“存储”和二进制与文本之间转换的文章。但这些并没有解决我的问题。我的问题更多的是关于二进制(16)的二进制搜索


在SQL Server中对二进制(16)字段执行CIDR搜索的最佳方法是什么

结果是我没有正确地创建二进制范围来执行搜索。我正在使用.NET IPAddress和BitArrayfor和/或按位操作。为了为网络部分创建正确的CIDR掩码,我必须在使用BitArray设置它们时反转每个字节的位顺序。原因是位位置首先存储为每个字节的最低有效位。例如,当使用位数组时,地址范围的9的按位位置(1-128)实际上是16。事实上,API中记录了这一点。现在,我可以使用预构建的网络掩码计算开始和结束范围,并在SQL表达式中使用它们