본문 바로가기

Programming/MS-SQL

[MSSQL] 임시테이블 생성

출처 : http://kr.blog.yahoo.com/jamesjine/1456817.html

임시 테이블

지역 및 전역 임시 테이블을 만들 수 있습니다. 지역 임시 테이블은 현재 세션에서만 볼 수 있으며 전역 임시 테이블은 모든 세션에서 볼 수 있습니다.
지역 임시 테이블 이름 앞에는 숫자 기호가 하나 추가되고(예: #table_name) 전역 임시 테이블 이름 앞에는 숫자 기호가 두 개 추가됩니다(예: ##table_name).
SQL 문은 CREATE TABLE 문의 table_name에 대해 지정된 값을 사용하여 임시 테이블을 참조합니다.
CREATE TABLE #MyTempTable (cola INT PRIMARY KEY)
INSERT INTO #MyTempTable VALUES (1)

여러 사용자가 동시에 실행할 수 있는 응용 프로그램 또는 저장 프로시저에서 지역 임시 테이블이 만들어지는 경우 SQL Server는 다른 사용자가 만든 테이블을 구별할 수 있어야 합니다. SQL Server는 각 지역 임시 테이블 이름에 내부적으로 숫자 접미사를 추가하여 구별합니다. tempdb의 sysobjects 테이블에 저장된 것과 같은 임시 테이블의 전체 이름은 CREATE TABLE 문에서 지정된 테이블 이름과 시스템에서 생성한 숫자 접미사로 구성됩니다. 접미사를 추가해야 하므로 지역 임시 이름으로 지정된 table_name은 116자를 초과할 수 없습니다.
임시 파일은 DROP TABLE을 사용하여 명시적으로 삭제하지 않는 한, 범위를 벗어나는 경우 자동으로 삭제됩니다.
 · 저장 프로시저에서 만들어진 지역 임시 테이블은 저장 프로시저가 완료될 때 자동으로 삭제됩니다. 테이블은 해당 테이블을 만든 저장 프로시저에 의해 실행되는 모든 중첩된 저장 프로시저에 의해 참조될 수 있습니다. 테이블은 테이블을 만든 저장 프로시저에 의해 호출된 프로세스에 의해서는 참조될 수 없습니다.
 · 기타 모든 지역 임시 테이블은 현재 세션이 끝날 때 자동으로 삭제됩니다.
 · 전역 임시 테이블은 테이블을 만든 세션이 끝나고 이를 참조하는 다른 모든 작업이 중지되면 자동으로 삭제됩니다. 작업과 테이블 간의 연결은 단일 Transact-SQL 문의 사용 기간 동안만 유지 관리됩니다. 즉, 전역 임시 테이블은 만들기 세션이 끝났을 때 테이블을 참조하는 마지막 Transact-SQL 문이 완료되면 삭제됩니다.
저장 프로시저 또는 트리거에서 만들어진 지역 임시 테이블은 저장 프로시저 또는 트리거가 호출되기 전에 만들어진 같은 이름의 임시 테이블과 구별됩니다. 쿼리가 임시 테이블을 참조하고 같은 이름의 두 임시 테이블이 동시에 존재하면 쿼리가 확인될 테이블이 정의되지 않습니다. 중첩된 저장 프로시저 또한 이를 호출한 저장 프로시저에 의해 만들어진 임시 테이블과 같은 이름의 임시 테이블을 만들 수 있습니다. 중첩된 저장 프로시저 내의 테이블 이름에 대한 모든 참조는 중첩된 프로시저에서 만들어진 테이블에 대해 확인됩니다. 예를 들어, 다음과 같습니다.
CREATE PROCEDURE Test2
AS
CREATE TABLE #t(x INT PRIMARY KEY)
INSERT INTO #t VALUES (2)
SELECT Test2Col = x FROM #t
GO
CREATE PROCEDURE Test1
AS
CREATE TABLE #t(x INT PRIMARY KEY)
INSERT INTO #t VALUES (1)
SELECT Test1Col = x FROM #t
EXEC Test2
GO
CREATE TABLE #t(x INT PRIMARY KEY)
INSERT INTO #t VALUES (99)
GO
EXEC Test1
GO



출처 : http://kr.ks.yahoo.com/service/ques_reply/ques_view.html?dnum=J&qnum=424843

안녕하세요.

우선 테스트는 MS-SQL에서 했습니다.
MS-SQL 같은 경우는 지역임시테이블일 경우에는 #,
전역임시테이블일 경우에는 ## 을 붙여 임시테이블로 표현합니다.
Informix에서의 임시테이블 표현은 제가 잘 몰라서리... ^^

#임시테이블 표현만 변경하시면 될 것 같습니다.
그리고 맨 밑에 보시면 DROP을 하는데,
어차피 세션 끊기면 사라집니다.

표현 바꾸고 실행해 보시면 두 임시테이블 모두 조회되는것을
보실 수 있을 것입니다.


CREATE TABLE     #임시테이블
(
        아이디           CHAR(20)     NOT NULL
    ,   이름             VARCHAR(12) NOT NULL
    ,   주민등록번호     CHAR(13)     NOT NULL
    ,       CHECK
            (
                    주민등록번호     >= '0000000000000'
            AND     주민등록번호     <= '9999999999999'
            )
)

CREATE TABLE     #임시테이블_2
(
        아이디           CHAR(20)     NOT NULL
    ,   이름             VARCHAR(12) NOT NULL
    ,   주민등록번호     CHAR(13)     NOT NULL
    ,       CHECK
            (
                    주민등록번호     >= '0000000000000'
            AND     주민등록번호     <= '9999999999999'
            )
)

INSERT #임시테이블
(
        아이디
    ,   이름
    ,   주민등록번호
)
VALUES
(
        'MRHONG'
    ,   '홍길동'
    ,   '0200421567801'
)

SELECT   *
FROM     #임시테이블

INSERT   #임시테이블_2
(
        아이디
    ,   이름
    ,   주민등록번호
)
(
SELECT   A.*
FROM     #임시테이블 A
    ,   MU100 B
WHERE   A.아이디 = B.아이디
)


SELECT   *
FROM     #임시테이블_2

DROP TABLE   #임시테이블
DROP TABLE   #임시테이블_2

님의 질문에 맞는 대답인지는 잘 모르겠습니다만... ^^
어쨌든 도움이 되셨기를 바랍니다.

그럼 즐프하세요.