有两个表
tb_SurveyData
tb_GeoIPCountryWhois (IP库)tb_SurveyData下有字段 sd_ip,sd_CountryName
sd_ip内的数据格式是127.0.0.1或202.163.21.2之类tb_GeoIPCountryWhois下有字段 nBeginnum,nEndnum,countryname
nBeginnum,nEndnum下是十进制的数字,如,1044052984,分别代表ip段的开始和结尾我希望有一个存储过程执行之后,直接分析出IP所属的国家,并把国家值写入tb_SurveyData下的sd_CountryName谢谢。附,将16进制转化为10进制的方法declare @w float
declare @x float
declare @y float
declare @z float
declare @ipnum float
-- ip1: 210.193.53.1
-- ip2: 211.157.121.109set @w=210
set @x=193
set @y=53
set @z=1
set @ipnum = 16777216*@w + 65536*@x + 256*@y + @z
tb_SurveyData
tb_GeoIPCountryWhois (IP库)tb_SurveyData下有字段 sd_ip,sd_CountryName
sd_ip内的数据格式是127.0.0.1或202.163.21.2之类tb_GeoIPCountryWhois下有字段 nBeginnum,nEndnum,countryname
nBeginnum,nEndnum下是十进制的数字,如,1044052984,分别代表ip段的开始和结尾我希望有一个存储过程执行之后,直接分析出IP所属的国家,并把国家值写入tb_SurveyData下的sd_CountryName谢谢。附,将16进制转化为10进制的方法declare @w float
declare @x float
declare @y float
declare @z float
declare @ipnum float
-- ip1: 210.193.53.1
-- ip2: 211.157.121.109set @w=210
set @x=193
set @y=53
set @z=1
set @ipnum = 16777216*@w + 65536*@x + 256*@y + @z
我希望有一个存储过程执行之后,直接分析出IP所属的国家,并把国家值写入tb_SurveyData下的sd_CountryName,而且是对整个tb_SurveyData表分析,有些细节问题不清楚,不知道谁写过,请教一下。
传入一个IP->转换成十进制数->根据十进制数从tb_GeoIPCountryWhois中取出国家名称->将十进制和对应的国家名称存贮到tb_SurveyData
GO
SET QUOTED_IDENTIFIER ON
GO
--转换IP函数--select dbo.UF_ConvertIP('211.157.121.109 ')
CREATE FUNCTION UF_ConvertIP
(
@IP VARCHAR(15))
RETURNS DECIMAL
ASBEGIN
DECLARE @i INT,@R DECIMAL
SET @i = CHARINDEX('.',@IP)
SET @R = 16777216 * CONVERT(DECIMAL,SUBSTRING(@IP,1,@i - 1))
SET @IP = SUBSTRING(@IP,@i + 1,LEN(@IP) - @i)SET @i = CHARINDEX('.',@IP)
SET @R = @R + 65536 * CONVERT(DECIMAL,SUBSTRING(@IP,1,@i - 1))
SET @IP = SUBSTRING(@IP,@i + 1,LEN(@IP) - @i)
SET @i = CHARINDEX('.',@IP)
SET @R = @R + 256 * CONVERT(DECIMAL,SUBSTRING(@IP,1,@i - 1))
SET @IP = SUBSTRING(@IP,@i + 1,LEN(@IP) - @i)RETURN @R + CONVERT(DECIMAL,@IP) END
GOSET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
set sd_CountryName = countryname
from tb_GeoIPCountryWhois
where UF_ConvertIP(sd_ip) >= Convert(decimal,nBeginnum) andUF_ConvertIP(sd_ip) <= Convert(decimal,nEndnum)