몇년전 골드PC방의 개념이 도입되었을 당시 각 PC 의 IP 대역을 웹에서 입력 받아
예로 211.000.000.1 ~ 50 를 사용하는 PC 방이라고 가정하고 50개의 아이피를 다 입력 할려고
가입시 많은 시간과 짜증을 낼것이 분명 하다.
그래서 사용하게 된 방법이 앞 3자리 211 , 000 , 000 를 받고 시작 IP 1 과 끝 IP 50을 입력 받아
실제 DB 상에는
211.000.000.1
211.000.000.2
211.000.000.3
:
:
211.000.000.50
으로 넣을수 있게 구현하게 되었다.
더 좋은 방법이 있겠지만..... 한번 만들어 보았다. ^^
USE TEMPDB
CREATE TABLE TESTIP
(
[NUM] INT IDENTITY(1,1)
,[IP] VARCHAR(20)
)
Insert Into TESTIP(IP) VALUES('211.101.221.1-50')
Insert Into TESTIP(IP) VALUES('211.101.221.51-100')
Insert Into TESTIP(IP) VALUES('211.101.221.101-150')
Insert Into TESTIP(IP) VALUES('211.101.221.151-200')
DECLARE @NUM INT
DECLARE @IP_LAST1 INT
DECLARE @IP_LAST2 INT
DECLARE @IP_PUBLIC VARCHAR(20)
DECLARE process_printlist CURSOR FOR
select [num]
,SUBSTRING(REVERSE(SUBSTRING(REVERSE(IP), 1, CHARINDEX('.', REVERSE(IP))-1)),1,CHARINDEX('-',REVERSE(SUBSTRING(REVERSE([IP]), 1, CHARINDEX('.', REVERSE([IP]))-1)))-1)
,REVERSE(SUBSTRING(REVERSE(IP), 1, CHARINDEX('-', REVERSE(IP))-1))
,SUBSTRING(IP, 1, LEN(IP)-CHARINDEX('.', REVERSE(IP))+1)
FROM TESTIP
OPEN process_printlist
WHILE 1 = 1
BEGIN
FETCH NEXT FROM process_printlist INTO @NUM,@IP_LAST1,@IP_LAST2,@IP_PUBLIC
IF @@FETCH_STATUS = -1 BREAK
IF @@FETCH_STATUS = -2 CONTINUE
SET @IP_LAST1 = @IP_LAST1
WHILE @IP_LAST1 <= @IP_LAST2
BEGIN
-- 테이블 만들어서 만들어진 IP 인서트 하면 되겠죠^^
SELECT CAST(@IP_PUBLIC AS VARCHAR(20)) + ''+ CAST(@IP_LAST1 AS VARCHAR(10))
SET @IP_LAST1 = @IP_LAST1 + 1
IF @IP_LAST1 > @IP_LAST2
BREAK
ELSE
CONTINUE
END
-- while
IF @@ERROR <> 0 RETURN
END
CLOSE process_printlist
DEALLOCATE process_printlist
--- 2번째 방법
USE TEMPDB
CREATE TABLE TESTIP
(
[NUM] INT IDENTITY(1, 1) ,
[IP1] VARCHAR(20) ,
[IP2] VARCHAR(20)
)
INSERT INTO TESTIP
( IP1 ,
IP2
)
VALUES ( '211.101.221.1' ,
'211.101.221.50'
)
DECLARE @NUM INT
DECLARE @IP_LAST1 INT
DECLARE @IP_LAST2 INT
DECLARE @IP_PUBLIC VARCHAR(20)
DECLARE process_printlist CURSOR
FOR
SELECT [num] ,
REVERSE(SUBSTRING(REVERSE(IP1), 1,
CHARINDEX('.', REVERSE(IP1)) - 1)) ,
REVERSE(SUBSTRING(REVERSE(IP2), 1,
CHARINDEX('.', REVERSE(IP2)) - 1)) ,
SUBSTRING(IP1, 1, LEN(IP1) - CHARINDEX('.', REVERSE(IP1)) + 1)
FROM TESTIP
OPEN process_printlist
WHILE 1 = 1
BEGIN
FETCH NEXT FROM process_printlist INTO @NUM, @IP_LAST1, @IP_LAST2,
@IP_PUBLIC
IF @@FETCH_STATUS = -1
BREAK
IF @@FETCH_STATUS = -2
CONTINUE
SET @IP_LAST1 = @IP_LAST1
WHILE @IP_LAST1 <= @IP_LAST2
BEGIN
-- 테이블만들어서만들어진IP 인서트하면되겠죠^^
SELECT CAST(@IP_PUBLIC AS VARCHAR(20)) + ''
+ CAST(@IP_LAST1 AS VARCHAR(10))
SET @IP_LAST1 = @IP_LAST1 + 1
IF @IP_LAST1 > @IP_LAST2
BREAK
ELSE
CONTINUE
END
-- while
IF @@ERROR <> 0
RETURN
END
CLOSE process_printlist
DEALLOCATE process_printlist
SELECT SUBSTRING(IP1, 1, LEN(IP1) - CHARINDEX('.', REVERSE(IP1)) + 1)
+ CONVERT(VARCHAR(5), number)
FROM ( SELECT number
FROM [master].dbo.spt_values
WHERE [type] = 'p'
AND number BETWEEN 1 AND 255
) A
INNER JOIN TESTIP B ON A.number >= REVERSE(SUBSTRING(REVERSE(IP1), 1,
CHARINDEX('.',
REVERSE(IP1))
- 1))
AND A.number <= REVERSE(SUBSTRING(REVERSE(IP2),
1,
CHARINDEX('.',
REVERSE(IP2))
- 1))