快速生成 IP 表

IF OBJECT_ID('[dbo].[ip_area]') IS NOT NULL
	DROP TABLE [dbo].[ip_area]
GO
CREATE TABLE [dbo].[ip_area](
	[id] [bigint] IDENTITY(1,1) NOT NULL,
	[ip] [varchar](20) NULL,
	[area] [nvarchar](300) NULL,
	[corp] [nvarchar](300) NULL,
	[isPrivate] [bit] NOT NULL DEFAULT ((0)),
	PRIMARY KEY CLUSTERED 
	(
		[id] ASC
	)
)
GO
--全部的IP是 2^32 ( 4 294 967 296 ), 太大不宜一次性 cross apply 插入, 否则事务太大, 出错回滚不易
SET NOCOUNT ON
DECLARE @1 INT,@2 INT,@beginTime DATETIME,@endTime DATETIME
SET @1=0
SET @2=0
SELECT number INTO #3 FROM [master]..spt_values WHERE TYPE='P' AND number BETWEEN 0 AND 255
SELECT number INTO #4 FROM [master]..spt_values WHERE TYPE='P' AND number BETWEEN 0 AND 255

WHILE @1<=255
BEGIN
	SET @beginTime=GETDATE()
	SET @2=0
	WHILE @2<=255
	BEGIN
		INSERT INTO ip_area(ip)
		SELECT CONCAT( @1, '.' , @2 , '.' , #3.number , '.' , #4.number ) 
		FROM #3 CROSS APPLY #4
		ORDER BY #3.number, #4.number
		SET @2=@2+1	
	END
	
	SET @endTime=GETDATE()
	SELECT @1 AS ip1,@beginTime AS beginTime, @endTime AS endTime, DATEDIFF(second, @beginTime, @endTime) AS elapsedSeconds
	SET @1=@1+1
END


如果机器内存大, 磁盘性能好, 可以用(更快一点):

--全部的IP是 2^32 ( 4 294 967 296 ), 太大不宜一次性 cross apply 插入, 否则事务太大, 出错回滚不易
SET NOCOUNT ON
DECLARE @1 INT,@beginTime DATETIME,@endTime DATETIME
SET @1=0
;WITH t2 AS (
	SELECT number FROM [master]..spt_values WHERE TYPE='P' AND number BETWEEN 0 AND 255
), t3 AS (
	SELECT number FROM [master]..spt_values WHERE TYPE='P' AND number BETWEEN 0 AND 255
), t4 AS(
	SELECT number FROM [master]..spt_values WHERE TYPE='P' AND number BETWEEN 0 AND 255
)
SELECT CONCAT(t2.number,'.',t3.number,'.',t4.number) AS ip234 INTO #234 FROM t2 CROSS APPLY t3 CROSS APPLY t4 ORDER BY t2.number,t3.number,t4.number

WHILE @1<=255
BEGIN
	SET @beginTime=GETDATE()
	INSERT INTO ip_area(ip)
	SELECT CONCAT( @1, '.', #234.ip234 ) 
	FROM #234
	
	SET @endTime=GETDATE()
	SELECT @1 AS ip1,@beginTime AS beginTime, @endTime AS endTime, DATEDIFF(second, @beginTime, @endTime) AS elapsedSeconds
	SET @1=@1+1
END


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值