상세 컨텐츠

본문 제목

table변수

청강컴정/DataBase

by luckey 2009. 3. 25. 20:44

본문

오늘 SQL 수업을 하는도중 있었던 일이다.
검색관련 Query를 작성하는 문제였는데.. CASE문을 사용해서 각각의 Query를 다르게 구현되도록 하는것이었다.

create proc test
(
    @searchType nvarchar(10),
    @searchText nvarchar(100)
)
as
begin
    declare @temp nvarchar(max)
    set @temp =
    case
         when @temp = 'id' then
                   (select * from board where id like '%'+searchText+'%')
         when @temp = 'name' then
                   (select * from board where name like '%'+searchText+'%')
    end
end

위와 같은식으로 작성을 했지만 계속 오류 발생..ㅠ.ㅠ
case 문 안의 select문은 string 형태로 인식을 한단다.. 실행을 해볼려고 부단히 노력을 해보았지만.. 실패..
그래서 예전에 배운 임시 테이블을 생각해보았는데 그것도 임시테이블을 만든다고 하게 되면 사용자가 많을경우에는..;;
그 많은 임시테이블을 어떻게 할 것인가.. 물론 지우면되지만.. 그래도...

혹시나 싶어서 자료형중에 table 형태를 가지는 자료형이 있지 않을가 생각하고 찾아보았는데 있다!!!!!
정말 있다!!!!

여기서부터는 msdn 참조
table(Transact-SQL)
나중에 처리하기 위해 결과 집합을 저장할 수 있는 특별한 데이터 형식입니다.
table은 주로 테이블 값 함수의 결과 집합으로 반환되는 행 집합을 임시로 저장하는 데 사용됩니다.
함수 및 변수를 table 형식으로 선언할 수 있으며 table 변수는 함수, 저장 프로시져 및 일괄처리에서 사용할 수 있습니다.


** table 변수의 이점은 다음과 같습니다. **

table 변수는 로컬변수처럼 작동하며 잘 정의된 범위르 가집니다. 범위는 변수가 선언된 함수, 저장 프로시져 또는 일괄처리 입니다.

범위내에서 일반 테입블처럼 table 변수를 사용할 수 있으며 select, insert, update 및 delete 문에서 테이블 또는 테이블식이 사용되는 어디에나 적용할 수 있습니다. 그러나 다음 문에서는 table을 사용할 수 없습니다.

SELECT select_list INTO table_variable - 사용불가

table 변수는 자신이 정의된 함수, 저장 프로시져 및 일괄 처리가 끝나면 자동으로 정리됩니다.

table형식 선언 내의 Check 제약조건, default 값 및 계산 열은 사용자 정의 함수를 호출 할 수 없습니다.

저장 프로시저에 table 변수를 사용하며 임시 테이블을 사용할 때보다 저장 프로시져를 다시 컴파일 하는 횟수가 줄어듭니다.

table 변수와 관련된 트랜젝션은 table 변수가 업데이트 되는 동안만 지속됩니다. 따라서 table 변수를 사용하면 리소스의 잠금과 로깅에 대한 요구가 줄어듭니다.

table변수 간의 할당 작업은 지원되지 않습니다. table 변수는 또한 제한된 범위를 가지며 영구 데이터베이스의 일부가 아니므로 트렌젝션 롤백의 영향을 받지 않습니다.

좋다!! 좋다!!! 정말 좋다!!!
한번 써보자!!

create proc tableTest
as
begin
    declare @tempTable Table
    (
        name nvarchar(10),
        title nvarchar(100)
    )
   
    insert into @tempTable
    select name, title from tempBoard

    select name, title from @tempTable
end

하지만 여전히 안되는것은 왜일까 고민을 해봤는데.. CASE문은 return 값을 여러개 가져가지 못하는것 같다.
제길....;;

create proc test
(
    @searchType nvarchar(10),
    @searchText nvarchar(100)
)
as
begin
    select * from board where
    (
      case @searchType
            when 'id' then id
            when 'name' then name
      end
   )
   (
      case 
           when @searchText <> '' then  like '%' + @searchText + '%'
      end
   )

관련글 더보기

댓글 영역