有两个表
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

解决方案 »

  1.   

    补充一下,是希望对tb_SurveyData表整个进行分析,分析所有sd_ip不为空的sd_CountryName的值
      

  2.   

    你这不是已经知道该怎么写了..找个IP的数据库,用你的那个@ipnum值去比较一下,不就得出来了.
      

  3.   

    还有一些不明白,
    我希望有一个存储过程执行之后,直接分析出IP所属的国家,并把国家值写入tb_SurveyData下的sd_CountryName,而且是对整个tb_SurveyData表分析,有些细节问题不清楚,不知道谁写过,请教一下。
      

  4.   

    是否为以下执行过程:
       传入一个IP->转换成十进制数->根据十进制数从tb_GeoIPCountryWhois中取出国家名称->将十进制和对应的国家名称存贮到tb_SurveyData
      

  5.   

    对,不过不是传入一个IP,是传入一个表名,分析这张表中的sd_ip
      

  6.   

    ip的值不是从外部传的,而是tb_SurveyData表中取的,sd_CountryName没有值的即从tb_GeoIPCountryWhois表中去取回来保存
      

  7.   

    将IP数据格式转换公式写成一个函数,然后一个UPDATE就可以搞定了
      

  8.   

    SET ANSI_NULLS ON
    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
      

  9.   

    update  tb_SurveyData 
    set sd_CountryName  = countryname 
    from tb_GeoIPCountryWhois
    where UF_ConvertIP(sd_ip) >= Convert(decimal,nBeginnum) andUF_ConvertIP(sd_ip) <= Convert(decimal,nEndnum)