반응형

이번 강좌에서는 사용자 정의 테이블 데이터 형식(User Defined Table Data Type)에 대한 내용을 살펴보겠습니다. 이론적인 설명보다 다음의 예를 보시면 사용자 정의 테이블 데이터 형식이 어떤 용도로 사용될 수 있는지 알 수 있을것입니다.

1) 데이터베이스와 테이블 만들기

우선 다음과 같이 Sample 이라는 이름의 연습용 데이터베이스와 Member 테이블을 만들겠습니다.

  1. -- 연습용 데이터베이스 만들기   
  2. CREATE DATABASE Sample   
  3. GO   
  4. -- 테이블 만들기   
  5. USE Sample   
  6. GO   
  7. CREATE TABLE Member (   
  8.  MemID varchar(10) PRIMARY KEY,   
  9.  MemName nvarchar(10),   
  10.  MemMail varchar(100)   
  11. )   
  12. GO  

2) 회원 정보 입력하기

이러한 상황에서 우리는 일반적으로 다음과 같이 Member 테이블에 회원 정보를 기록하는 저장 프로시저를 만들어 사용을 합니다.

  1. -- 프로시저 만들기   
  2. CREATE PROCEDURE usp_InsertMember   
  3.  @MemID varchar(10),   
  4.  @MemName nvarchar(10),   
  5.  @MemMail varchar(100)   
  6. AS  
  7.  SET NOCOUNT ON  
  8.  INSERT INTO Member(MemID, MemName, MemMail)    
  9.   VALUES(@MemID@MemName@MemMail)   
  10.  SET NOCOUNT OFF  
  11. GO  

위와 같이 저장 프로시저를 만들고 다음과 같이 호출해서 회원 정보를 입력합니다.

  1. -- 프로시저 수행   
  2. EXECUTE usp_InsertMember 'jrlee', N'이장래''jrlee@sample.com'  
  3. EXECUTE usp_InsertMember 'hong', N'홍길동''gildong@sample.com'  
  4. EXECUTE usp_InsertMember 'han', N'한국인''han@sample.com'  
  5. GO   
  6. -- 확인   
  7. SELECT * FROM Member   
  8. GO   
  9. /*  
  10. [결과]  
  11. MemID   MemName   MemMail  
  12. ------- -------- ---------------------------------  
  13. han     한국인    han@sample.com  
  14. hong    홍길동    gildong@sample.com  
  15. jrlee   이장래    jrlee@sample.com  
  16. (3개 행이 영향을 받음)  
  17. */  

자, 이제 사용자 정의 테이블 데이터 형식을 사용하는 예를 보도록 하겠습니다.

3) 새로운 테이블 만들기

사용자 정의 테이블 데이터 형식 사용예를 보기 위해 앞에서 사용한 Member 테이블과 같은 구조의 Member2 테이블을 만들어 사용하겠습니다.

  1. -- 테이블 만들기   
  2. CREATE TABLE Member2 (   
  3.  MemID varchar(10) PRIMARY KEY,   
  4.  MemName nvarchar(10),   
  5.  MemMail varchar(100)   
  6. )   
  7. GO  

4) 사용자 정의 테이블 데이터 형식 만들기

사용자 정의 테이블 데이터 형식은 다음과 같이 CREATE TYPE 문을 사용해 만듭니다. 일반적인 테이블을 만드는 방법과 거의 유사하게 만드는 것을 알 수 있습니다.

  1. -- 사용자 정의 테이블 데이터 형식 만들기   
  2. CREATE TYPE MemberTableType AS TABLE (   
  3.  MemID varchar(10),    
  4.  MemName nvarchar(10),    
  5.  MemMail varchar(100)   
  6. )   
  7. GO  

5) 저장 프로시저 만들기

앞의 단계에서 만든 사용자 정의 테이블 데이터 형식을 사용하는 저장 프로시저를 만듭니다. 매개변수에 @MemList MemberTableType 처럼 앞의 단계에서 만든 사용자 정의 테이블 데이터 형식을 갖는 매개 변수를 선언합니다.

  1. -- 저장 프로시저 만들기   
  2. CREATE PROCEDURE usp_InsertMember2   
  3.     @MemList MemberTableType READONLY  -- READONLY 속성을 필히 지정해야 함   
  4. AS    
  5.     SET NOCOUNT ON  
  6.     INSERT INTO Member2(MemID, MemName, MemMail)   
  7.         SELECT * FROM  @MemList  
  8.  SET NOCOUNT ON  
  9. GO  

6) 회원 정보 입력하기

앞의 단계에서 만든 저장 프로시저를 사용해 Member2 테이블에 회원 정보를 입력할 때 이제 다음과 같이 하면 됩니다. 앞에서 만든  MemberTableType 사용자 정의 테이블 데이터 형식을 갖는 변수 @MemberTVP를 선언하고 이 변수에 입력하고자 하는 회원 정보를 입력합니다. 그리고 @MemberTVP 변수를 저장 프로시저의 매개변수로 전달합니다.
이렇게 되면 @MemberTVP 변수에 입력된 여러 회원 정보가 저장 프로시저에 한번에 전달되고, 이 전달된 회원들 정보는 저장 프로시저에 의해 Member2 테이블에 입력됩니다. 결국 저장 프로시저는 한번만 호출된 결과를 가져옵니다.

  1. -- 프로시저 수행 예 (1)   
  2. DECLARE @MemberTVP AS MemberTableType   
  3. INSERT INTO @MemberTVP (MemID, MemName, MemMail)    
  4.  VALUES('jang', N'이장군''jgoon@sample.com')   
  5. INSERT INTO @MemberTVP (MemID, MemName, MemMail)    
  6.  VALUES('jane', N'박제인''jane@sample.com')   
  7. INSERT INTO @MemberTVP (MemID, MemName, MemMail)    
  8.  VALUES('tomy', N'정토미''jtomy@sample.com')   
  9. EXEC usp_InsertMember2 @MemberTVP;   
  10. GO   
  11. -- 확인   
  12. SELECT * FROM Member2   
  13. GO   
  14. /*  
  15. [결과]  
  16. MemID  MemName  MemMail  
  17. ------ -------- ---------------------------------  
  18. jane   박제인    jane@sample.com  
  19. jang   이장군    jgoon@sample.com  
  20. tomy   정토미    jtomy@sample.com  
  21. (3개 행이 영향을 받음)  
  22. */  

다음과 같은 수행도 가능합니다. 맨 앞에서 살펴본 일반적인 예에서 Member 테이블에 입력된 3명의 회원 정보를 Member2 테이블에 입력하고 싶으면 다음과 같이 수행하면 됩니다.

  1. -- 프로시저 수행 예(2)   
  2. DECLARE @MemberTVP AS MemberTableType;   
  3. INSERT INTO @MemberTVP (MemID, MemName, MemMail)    
  4.  SELECT * FROM Member   
  5. EXEC usp_InsertMember2 @MemberTVP  
  6. GO   
  7. -- 확인   
  8. SELECT * FROM Member2    
  9. GO   
  10. /*  
  11. [결과]  
  12. MemID   MemName  MemMail  
  13. ------- -------- ---------------------------------  
  14. hong    홍길동    gildong@sample.com  
  15. jane    박제인    jane@sample.com  
  16. jang    이장군    jgoon@sample.com  
  17. jrlee   이장래    jrlee@sample.com  
  18. tomy    정토미    jtomy@sample.com  
  19. (5개 행이 영향을 받음)  
  20. */  

 

이처럼 SQL Server 2008에 추가된 사용자 정의 테이블 데이터 형식은 행 집합을 저장 프로시저에 전달할 수 있어 매우 유용하게 사용될 수 있습니다. 단, 한번 만들어져서 사용 중인 사용자 정의 테이블 데이터 형식를 바꾸기 힘들고 제거하기도 힘듭니다. 물론 방법이 있지만 번거로운 작업이 됩니다. 그러므로 명확한 분석을 기반으로 디자인 되어야 합니다.

 

반응형

'연구개발 > SQL2008' 카테고리의 다른 글

문자열 검사 / 문자겸사 / 필드검사  (0) 2010.04.13
Database 수정  (0) 2010.04.11
제 7 장: 리소스 관리자  (0) 2009.06.21
제 6 장: SSMS의 디버깅 기능  (0) 2009.06.21
제 5 장: SSMS의 IntelliSense 기능  (0) 2009.06.21

+ Recent posts