그 동안 열심히 일하다 공부하다 까먹을까 중간중간 포스팅을 했는데,
요근래는 알수없는 귀차니즘..ㅠㅠ
정신차리잣!!
일단 오늘은 MS-SQL 에서 있는 임시테이블 기능이다.
데이터 가공시 조회결과를 일시적으로 저장해두었다, 다시 재활용 해야 하는 경우에 유용한 것 같다.
오늘도 즐겁게 써먹음. ㅋㅋㅋ
일단 출처는 큼지막하게~!
출처 : http://dualist.tistory.com/133
임시 테이블
지역 및 전역 임시 테이블을 만들 수 있습니다. 지역 임시 테이블은 현재 세션에서만 볼 수 있으며 전역 임시 테이블은 모든 세션에서 볼 수 있습니다.
지역 임시 테이블 이름 앞에는 숫자 기호가 하나 추가되고(예: #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
안녕하세요.
우선 테스트는 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
님의 질문에 맞는 대답인지는 잘 모르겠습니다만... ^^
어쨌든 도움이 되셨기를 바랍니다.
그럼 즐프하세요.
'DataBase > MS-SQL' 카테고리의 다른 글
VIEW 인덱스 생성시 스키마바인딩 (0) | 2012.10.31 |
---|---|
실행된 쿼리내역 조회 (0) | 2012.10.24 |
연결된 서버(Linked Server) 를 이용한 조건별 다수 업데이트 (0) | 2012.07.02 |
경고: 집계 또는 다른 SET 작업에 의해 Null 값이 제거되었습니다. (0) | 2012.05.18 |
MS-SQL 2008 에서 IDENTITY 경고 풀기 (0) | 2012.03.06 |
댓글