본문 바로가기

프로그래밍/MSSQL

MS-SQL 테이블 변수를 활용한 배열 처리

1. 타입별로 수량 및 데이터 건수를 가져오고 싶을 때 활용

테이블 변수

- 테이블 반환 매개 변수입니다. 테이블 이름은 (@)시작한다.
- 테이블 변수가 정의된 함수 및 저장프로시저, 일괄 처리가 끝나면 자동으로 정리함
- 트랜잭션은 테이블 변수가 업데이트 되는 동안만 지속됨.
- 리소스 잠금과 로깅에 대한 요구가 줄어듬

참조사이트 : 
http://blog.naver.com/PostView.nhn?blogId=islove8587&logNo=220608680181

T-SQL이란(Transact-SQL)

- SQL 표준 상에서 확장
- 선언문을 이용하여 관계형 데이터베이스를 조회하고 변경하고 정의
- 다양한 지원 함수, DELETE 및 UPDATE 문에 대한 변경, 절차적 프로그래밍, 지역 변수를 포함.
- 트랜젝트 SQL의 흐름 제어 키워드로 BEGIN / END, BREAK, CONTINUE, GOTO, IF / ELSE, RETURN, WAITFOR, WHILE이 있다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
-- 테이블 변수 생성
DECLARE @MAILTYPE_TABLE TABLE (
  type varchar(50),
)
 
-- 스칼라 변수 생성
DECLARE @TYPEARRAY VARCHAR(500)
DECLARE @SPLIT_TEMP VARCHAR(50)
 
-- 스칼라 변수 셋팅
SET @TYPEARRAY = 'JoinComplete,PointBuy,RequestPay,RequestData,RequestDataNPay,PayComplete,OrderEnd,MakeBegin,Delivery '
 
-- WHILE 문, INDEX의 값으로 판단
WHILE CHARINDEX(',',@TYPEARRAY) <> 0
  BEGIN 
    SET @SPLIT_TEMP = (SUBSTRING(@TYPEARRAY, 1, CHARINDEX(',', @TYPEARRAY) - 1)) -- 인덱스 1번부터 ','(콤마)까지 문자열 자르기
    INSERT INTO @MAILTYPE_TABLE VALUES(@SPLIT_TEMP)
    SET @TYPEARRAY = SUBSTRING(@TYPEARRAY, CHARINDEX(',', @TYPEARRAY) + 1, LEN(@TYPEARRAY)) -- ','(콤마) 다음 문자열부터 @TYPEARRAY 변수 문자 총길이까지 문자열 자르기
  END 
 
-- INDEX 값이 0이면
IF CHARINDEX(',',@TYPEARRAY) = 0
BEGIN 
  SET @SPLIT_TEMP = SUBSTRING(@TYPEARRAY, 1, LEN(@TYPEARRAY))
    INSERT INTO @MAILTYPE_TABLE VALUES(@SPLIT_TEMP)
END
 
-- SELECT 테이블 변수 
SELECT * FROM @MAILTYPE_TABLE
 
 
 
cs

< 테이블 변수, 배열처리를 활용한 결과 >

임시 테이블 

- 테이블 이름은 (#)시작한다. 
- 사용자가 연결이 끊겼을 때 임시 테이블은 삭제되며, 삭제되지 않은 경우 SQL Servere에서 자동으로 임시 테이블을 삭제한다.
- 시스템 데이터베이스 Tempdb에 저장된다. 단 데이터 건수가 작을 때는 메모리에만 존재 Tempdb 사이즈 증가 안함(데이터가 29k일때는 메모리 존재

참조사이트 : http://blog.naver.com/PostView.nhn?blogId=islove8587&logNo=220608680181


전역 임시 테이블, 메모리 최적화 기법

- ##table 활용 : #table과 다른 큰 차이점은 런타임 시가 아니라 배포 시 테이블을 만든다.
- 전역 임시 테이블은 컴파일 오버헤드를 방지하기 위해 런타임 시가 아닌 배포 시 테이블을 만든다는 점이 가장 큰 변화
전역 임시 테이블을 다음과 같이 DURABILITY = SCHEMA_ONLY가 선언된 메모리 최적화 테이블로 바꾸는 것이 좋습니다.

세션 임시 테이블, 메모리 최적화 기법

- #table, 런타임 시 테이블 생성