본문 바로가기
㏈ª By β┖υΕJini/MS-SQL

[MS-SQL] 아이피 분리해서 넣기

by ㏈ª ☞ β┖υΕJini.κR 2008. 11. 18.

사용자 삽입 이미지


몇년전 골드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))