加为好友
发送私信
在线聊天
dawugui
等级:
可用分等级:贫农
总技术分:130550
总技术分排名:29
发表于:2008-03-20 16:56:05 10 楼 得分:50
语句应该是没错的了.
现在不是对不对的问题了.
而是你的IP不能通过这样来计算大小.
得用下面的方法.
/*
判断IP地址在表中两个IP段的位置
(爱新觉罗.毓华 2007-12-31 广东深圳 答csdn zyciis630)
原帖地址:http://topic.csdn.net/u/20071230/22/f4c19d7f-194d-47c9-9840-474ca79c782f.html
*/
/*问题描述
比我我IP:220.113.49.43
然后我有如下的数据库
那么我如何正确的查询出我的IP是符合哪一个数据呢
StartIP EndIP Area
220.112.208.0 220.112.255.255 湖北省武汉市 长城宽带
220.113.0.0 220.113.48.255 北京市 长城宽带
220.113.49.0 220.113.63.255 广东省广州市 长城宽带
220.113.64.0 220.113.79.22 湖北省武汉市 长城宽带
220.113.79.23 220.113.79.23 湖北省宜昌市 长城宽带刘家大堰小区
220.113.79.24 220.113.81.208 湖北省武汉市 长城宽带
220.113.81.209 220.113.81.209 湖北省武汉市 (汉口)解放大道1511号名仕装饰工程有限公司
220.113.81.210 220.113.107.52 湖北省武汉市 长城宽带
220.113.107.53 220.113.107.53 湖北省武汉市 徐东路逸居苑小区
220.113.107.54 220.113.122.182 湖北省武汉市 长城宽带
220.113.122.183 220.113.122.183 湖北省武汉市 长城宽带湖北大学校内
220.113.122.184 220.113.127.255 湖北省武汉市 长城宽带
*/
--------------------------------------------------------------
create table tb(StartIP varchar(50),EndIP varchar(50),Area varchar(100))
insert into tb values('220.112.208.0' ,'220.112.255.255','湖北省武汉市 长城宽带')
insert into tb values('220.113.0.0' ,'220.113.48.255' ,'北京市 长城宽带')
insert into tb values('220.113.49.0' ,'220.113.63.255' ,'广东省广州市 长城宽带')
insert into tb values('220.113.64.0' ,'220.113.79.22' ,'湖北省武汉市 长城宽带')
insert into tb values('220.113.79.23' ,'220.113.79.23' ,'湖北省宜昌市 长城宽带刘家大堰小区')
insert into tb values('220.113.79.24' ,'220.113.81.208' ,'湖北省武汉市 长城宽带')
insert into tb values('220.113.81.209' ,'220.113.81.209' ,'湖北省武汉市 (汉口)解放大道1511号名仕装饰工程有限公司 ')
insert into tb values('220.113.81.210' ,'220.113.107.52' ,'湖北省武汉市 长城宽带')
insert into tb values('220.113.107.53' ,'220.113.107.53' ,'湖北省武汉市 徐东路逸居苑小区')
insert into tb values('220.113.107.54' ,'220.113.122.182','湖北省武汉市 长城宽带')
insert into tb values('220.113.122.183','220.113.122.183','湖北省武汉市 长城宽带湖北大学校内')
insert into tb values('220.113.122.184','220.113.127.255','湖北省武汉市 长城宽带')
go
declare @ip as varchar(50)
set @ip = '220.113.49.43'
select startip , endip , area
from tb
where
cast(PARSENAME(@ip , 4) as bigint) * 256 * 256 * 256 + cast(PARSENAME(@ip , 3) as bigint) * 256 * 256 + cast(PARSENAME(@ip , 2) as bigint) * 256 + cast(PARSENAME(@ip , 1) as bigint) > =
cast(PARSENAME(startip , 4) as bigint) * 256 * 256 * 256 + cast(PARSENAME(startip , 3) as bigint) * 256 * 256 + cast(PARSENAME(startip , 2) as bigint) * 256 + cast(PARSENAME(startip , 1) as bigint) and
cast(PARSENAME(@ip , 4) as bigint) * 256 * 256 * 256 + cast(PARSENAME(@ip , 3) as bigint) * 256 * 256 + cast(PARSENAME(@ip , 2) as bigint) * 256 + cast(PARSENAME(@ip , 1) as bigint) <=
cast(PARSENAME(endip , 4) as bigint) * 256 * 256 * 256 + cast(PARSENAME(endip , 3) as bigint) * 256 * 256 + cast(PARSENAME(endip , 2) as bigint) * 256 + cast(PARSENAME(endip , 1) as bigint)
drop table tb
/*
startip endip area
-------------- -------------- --------------------
220.113.49.0 220.113.63.255 广东省广州市 长城宽带
(1 行受影响)
*/
----
以下用函数实现(csdn happyflystone完成)
CREATE FUNCTION dbo.f_IP2Int(
@ip char(15)
)RETURNS bigint
AS
BEGIN
DECLARE @re bigint
SET @re=0
SELECT @re=@re+LEFT(@ip,CHARINDEX('.',@ip+'.')-1)*ID
,@ip=STUFF(@ip,1,CHARINDEX('.',@ip+'.'),'')
FROM(
SELECT ID=CAST(16777216 as bigint)
UNION ALL SELECT 65536
UNION ALL SELECT 256
UNION ALL SELECT 1)a
RETURN(@re)
END
GO
declare @t table(StartIP varchar(15),EndIP varchar(15),Area varchar(100))
insert @t select '220.112.208.0','220.112.255.255','湖北省武汉市 长城宽带 '
insert @t select '220.113.0.0','220.113.48.255','北京市 长城宽带'
insert @t select '220.113.49.0','220.113.63.255','广东省广州市 长城宽带 '
insert @t select '220.113.64.0','220.113.79.22','湖北省武汉市 长城宽带'
insert @t select '220.113.79.23','220.113.79.23','湖北省宜昌市 长城宽带刘家大堰小区'
insert @t select '220.113.79.24','220.113.81.208','湖北省武汉市 长城宽带'
insert @t select '220.113.81.209','220.113.81.209','湖北省武汉市 (汉口)解放大道1511号名仕装饰工程有限公司'
insert @t select '220.113.81.210','220.113.107.52','湖北省武汉市 长城宽带 '
insert @t select '220.113.107.53','220.113.107.53','湖北省武汉市 徐东路逸居苑小区'
insert @t select '220.113.107.54','220.113.122.182','湖北省武汉市 长城宽带'
insert @t select '220.113.122.183','220.113.122.183','湖北省武汉市 长城宽带湖北大学校内'
insert @t select '220.113.122.184','220.113.127.255','湖北省武汉市 长城宽带'
declare @ip varchar(15)
set @ip = '220.113.49.43'
select *
from @t
where dbo.f_IP2Int(@ip) between dbo.f_IP2Int(StartIP) and dbo.f_IP2Int(EndIP)
drop function f_IP2Int
/*
StartIP EndIP Area
-------------------------------------------------
220.113.49.0 220.113.63.255 广东省广州市 长城宽带
(所影响的行数为 1 行)
*/
---
IP为'220.113.53.221'
insert into tb values('220.113.49.0' ,'220.113.63.255' ,'广东省广州市 长城宽带')
insert into tb values('220.113.53.0' ,'220.113.53.255' ,'广东省广州市 东兴小区长城宽带')
也就是有大区间包含小区间。
[code=SQL]create table tb(StartIP varchar(50),EndIP varchar(50),Area varchar(100))
insert into tb values('220.112.208.0' ,'220.112.255.255','湖北省武汉市 长城宽带')
insert into tb values('220.113.0.0' ,'220.113.48.255' ,'北京市 长城宽带')
insert into tb values('220.113.49.0' ,'220.113.63.255' ,'广东省广州市 长城宽带')
insert into tb values('220.113.53.0' ,'220.113.53.255' ,'广东省广州市 东兴小区长城宽带')
insert into tb values('220.113.64.0' ,'220.113.79.22' ,'湖北省武汉市 长城宽带')
insert into tb values('220.113.79.23' ,'220.113.79.23' ,'湖北省宜昌市 长城宽带刘家大堰小区')
insert into tb values('220.113.79.24' ,'220.113.81.208' ,'湖北省武汉市 长城宽带')
insert into tb values('220.113.81.209' ,'220.113.81.209' ,'湖北省武汉市 (汉口)解放大道1511号名仕装饰工程有限公司 ')
insert into tb values('220.113.81.210' ,'220.113.107.52' ,'湖北省武汉市 长城宽带')
insert into tb values('220.113.107.53' ,'220.113.107.53' ,'湖北省武汉市 徐东路逸居苑小区')
insert into tb values('220.113.107.54' ,'220.113.122.182','湖北省武汉市 长城宽带')
insert into tb values('220.113.122.183','220.113.122.183','湖北省武汉市 长城宽带湖北大学校内')
insert into tb values('220.113.122.184','220.113.127.255','湖北省武汉市 长城宽带')
go
declare @ip as varchar(50)
set @ip = '220.113.53.221'
select a.*
from tb a,
(
select ipscore = min(cast(PARSENAME(endip , 4) as bigint) * 256 * 256 * 256 + cast(PARSENAME(endip , 3) as bigint) * 256 * 256 + cast(PARSENAME(endip , 2) as bigint) * 256 + cast(PARSENAME(endip , 1) as bigint) -
cast(PARSENAME(startip , 4) as bigint) * 256 * 256 * 256 + cast(PARSENAME(startip , 3) as bigint) * 256 * 256 + cast(PARSENAME(startip , 2) as bigint) * 256 + cast(PARSENAME(startip , 1) as bigint))
from tb
where
cast(PARSENAME(@ip , 4) as bigint) * 256 * 256 * 256 + cast(PARSENAME(@ip , 3) as bigint) * 256 * 256 + cast(PARSENAME(@ip , 2) as bigint) * 256 + cast(PARSENAME(@ip , 1) as bigint) > =
cast(PARSENAME(startip , 4) as bigint) * 256 * 256 * 256 + cast(PARSENAME(startip , 3) as bigint) * 256 * 256 + cast(PARSENAME(startip , 2) as bigint) * 256 + cast(PARSENAME(startip , 1) as bigint) and
cast(PARSENAME(@ip , 4) as bigint) * 256 * 256 * 256 + cast(PARSENAME(@ip , 3) as bigint) * 256 * 256 + cast(PARSENAME(@ip , 2) as bigint) * 256 + cast(PARSENAME(@ip , 1) as bigint) <=
cast(PARSENAME(endip , 4) as bigint) * 256 * 256 * 256 + cast(PARSENAME(endip , 3) as bigint) * 256 * 256 + cast(PARSENAME(endip , 2) as bigint) * 256 + cast(PARSENAME(endip , 1) as bigint)
) b
where cast(PARSENAME(a.endip , 4) as bigint) * 256 * 256 * 256 + cast(PARSENAME(a.endip , 3) as bigint) * 256 * 256 + cast(PARSENAME(a.endip , 2) as bigint) * 256 + cast(PARSENAME(a.endip , 1) as bigint) -
cast(PARSENAME(a.startip , 4) as bigint) * 256 * 256 * 256 + cast(PARSENAME(a.startip , 3) as bigint) * 256 * 256 + cast(PARSENAME(a.startip , 2) as bigint) * 256 + cast(PARSENAME(a.startip , 1) as bigint)
= b.ipscore
drop table tb
/*
StartIP EndIP Area
--------------------------------------------------------------
220.113.53.0 220.113.53.255 广东省广州市 东兴小区长城宽带
(1 行受影响)
*/
修改 删除 举报 引用 回复