永发信息网

将IP全部转换为十进制,存到另一个新表?MS SQL中

答案:1  悬赏:0  手机版
解决时间 2021-04-30 16:11
  • 提问者网友:龅牙恐龙妹
  • 2021-04-30 12:21

程序代码

-- 建立IP转换到十进制方法
USE [数据库名]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date, ,>
-- Description: 转换IP为十进制
-- =============================================
Create FUNCTION [dbo].[X16ToDe]
(
@Old_IP nvarchar(15)
)
RETURNS numeric
AS
BEGIN
DECLARE
@CharIndex INT,
@CurrPoint INT,
@SingleValue NVARCHAr(5),
@Cache numeric

SET @CharIndex = 1
SET @CurrPoint = CHARINDEX('.',@Old_IP,@CharIndex)
SET @SingleValue = SUBSTRINg(@Old_IP,@CharIndex,@CurrPoint - @CharIndex)
SET @Cache = cast(@SingleValue as numeric)*16777216

SET @CharIndex = @CurrPoint + 1
SET @CurrPoint = CHARINDEX('.',@Old_IP,@CharIndex)
SET @SingleValue = SUBSTRINg(@Old_IP,@CharIndex,@CurrPoint - @CharIndex)
SET @Cache = @Cache + cast(@SingleValue as numeric)*65536

SET @CharIndex = @CurrPoint + 1
SET @CurrPoint = CHARINDEX('.',@Old_IP,@CharIndex)
SET @SingleValue = SUBSTRINg(@Old_IP,@CharIndex,@CurrPoint - @CharIndex)
SET @Cache = @Cache + cast(@SingleValue as numeric)*256

SET @CharIndex = @CurrPoint + 1
SET @SingleValue = SUBSTRINg(@Old_IP,@CharIndex,len(@Old_IP)- @CharIndex + 1)
SET @Cache = @Cache + cast(@SingleValue as numeric)

RETURN @Cache;
END


程序代码

-- 建立十进制新表
USE [数据库名]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
Create TABLE [dbo].[uestc_ipdata](
[pstartip] [numeric](18, 0) NULL,
[pendip] [numeric](18, 0) NULL,
[paddress1] [nvarchar](50) NULL,
[paddress2] [nvarchar](200) NULL
) ON [PRIMARY]

这一步你可以自己按照你的情况来做,我是为了加快数据库索引的速度,所以将IP全部转换为十进制,存到一个新表里面。


程序代码

-- 格式化省份
Update [数据库名].[dbo].[IP]
SET [paddress1] = replace([paddress1],N'省',N'省 ')

-- 删除CZ88.NET
Update [数据库名].[dbo].[IP]
SET [paddress1] = replace([paddress1],N'CZ88.NET',N'')

-- 将地区提出
Update [数据库名].[dbo].[IP]
SET [paddress2] = SUBSTRINg([paddress1],CHARINDEX(' ',[paddress1],1)+1,len([paddress1]))

-- 存为国家或省份
Update [数据库名].[dbo].[IP]
SET [paddress1] = SUBSTRINg([paddress1],0,CHARINDEX(' ',[paddress1],1))

-- 去处前后导空格
Update [数据库名].[dbo].[IP]
SET [paddress1] = Rtrim(Ltrim([paddress1]))
,[paddress2] = Rtrim(Ltrim([paddress2]))

-- 转换IP为十进制,并写入新表
Insert INTO [数据库名].[dbo].[uestc_ipdata]
([pstartip]
,[pendip]
,[paddress1]
,[paddress2])
Select dbo.X16ToDe([pstartip])
,dbo.X16ToDe([pendip])
,[paddress1]
,[paddress2]
FROM [数据库名].[dbo].[IP]
order by [pstartip] ASC

最后测试一下看看:

程序代码

-- 测试
DECLARE @IPNumber numeric
set @IPNumber = dbo.X16ToDe('219.140.31.91')

Select [pstartip]
,[pendip]
,[paddress1]
,[paddress2]
FROM [数据库名].[dbo].[uestc_ipdata]
Where [pstartip] <= @IPNumber and [pendip] >= @IPNumber

以上是原先执行命令代码 怎么修改可以把新建的表里修改成
以下操作

1,-- 将地区提出
修改为不提出

2,-- 存为国家或省份 如:四川省
修改为国家省份地区详细显示 。。如:四川省内江市资中县 电信ADSL 这样的显示或者原表里的这个地方的地址数据不操作只把ip数据修改成十进制显示就好
原表是下面的式样
221.237.213.0 221.237.216.255 四川省 电信
221.237.217.0 221.237.217.255 四川省眉山市 电信
221.237.218.0 221.237.221.255 四川省 电信
221.237.222.0 221.237.222.255 四川省遂宁市 电信
221.237.223.0 221.237.225.255 四川省 电信
221.237.226.0 221.237.226.255 四川省遂宁市 电信

修改成新原表是下面的式样十进制ip
xxxxxxxxxx xxxxxxxxx 电信.四川省遂宁市
xxxxxxxxxx xxxxxxxxx 电信.四川省
xxxxxxxxxx xxxxxxxxx 电信.四川省遂宁市

代码怎么修改 请大侠指教!!

最佳答案
  • 五星知识达人网友:独行浪子会拥风
  • 2021-04-30 13:30

原IP列为字符串,建议新建两列,以后使用也方便,不然以后还得转换,[NewStartIP]和[NewEndIP]均为BIGINT型


CREATE FUNCTION dbo.IPAddressToInteger (@IP AS VARCHAr(15))RETURNS BIGINTASBEGINRETURN (CONVERT(BIGINT, PARSENAME(@IP,1)) +CONVERT(BIGINT, PARSENAME(@IP,2)) * 256 +CONVERT(BIGINT, PARSENAME(@IP,3)) * 65536 +CONVERT(BIGINT, PARSENAME(@IP,4)) * 16777216)ENDGO
Update [BasName].[dbo].[IP] Set [NewStartIP] = ado.IPAddressToInteger([StartIP]), [NewEndIP] = ado.IPAddressToInteger([EndIP])
DROP FUNCTION dbo.IPAddressToInteger

我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯