본문 바로가기

db

커서(CURSOR)를 TABLE변수로 변경


가끔 작업을 하다보면 커서를 사용해야 할 경우가 있다.
대표적인 경우가... 루프문을 사용해서 데이터를 추출하고 싶을 경우겠지요... 아닌가?? =_=;
나는 종종 커서를 사용해왔었다...

허나.. 커서 및 임시 테이블의 경우 최대한 자제를 해야 된다고... 어디선가 많이 본 기억이...
커서의 경우 서버 자원을 많이 낭비하게 되며 커서로 할 수 있는 건 임시 테이블이나
테이블 변수로도 모두 처리가 가능하단다...

그리하여 현재 회사프로젝트 커서사용부분을 모두 바꾸기로 결심...

사용데이터베이스 : PUBS
사용테이블 : TITLES

원하는 결과값은

(18 row(s) affected)
But Is It User Friendly? | Computer Phobic AND Non-Phobic Individuals: Behavior Variations | Cooking with Computers: Surreptitious Balance Sheets | Emotional Security: A New Algorithm | Fifty Years in Buckingham Palace Kitchens | Is Anger the Enemy? | Life Without Fear | Net Etiquette | Onions, Leeks, and Garlic: Cooking Secrets of the Mediterranean | Prolonged Data Deprivation: Four Case Studies | Secrets of Silicon Valley | Silicon Valley Gastronomic Treats | Straight Talk About Computers | Sushi, Anyone? | The Busy Executive's Database Guide | The Gourmet Microwave | The Psychology of Computer Cooking | You Can Combat Computer Stress!

한 필드에 TITLES테이블의 TITLE을 구분자 | 로 묶어 가져오는 것이다.
(참고자료 : SQL Server 성능 향상을 위한 튜닝 가이드)

#테이블 변수사용의 예

use pubs
go

declare @tmptable table
(
    nid int identity(1,1) not null,
    title varchar(80) not null
) -- 테이블 변수 선언

insert @tmptable(title)
select title from titles -- titles테이블의 title을 테이블변수에 삽입(루프생성을 위해)

declare @print varchar(5000) -- print변수 선언

declare @i int, @maxno int, @title varchar(80)     -- 루프변수 선언
select @i=1, @maxno=max(nid) from @tmptable   -- 루프변수 초기화
while @i<=@maxno -- 루프문
begin
    select @title=title from @tmptable where nid=@i -- 커서의 fetch into해당
    if(@i = 1)
    begin
        set @print = @title
    end
    else
    begin
        set @print = @print + ' | ' + @title
    end
    set @i=@i+1
end 
print @print

#커서사용의 예

declare @title varchar(100)
declare @print varchar(5000)
set @print = ''
declare c_cursor CURSOR FOR
   select title from titles
for read only

open c_cursor
fetch next from c_cursor
into @title
while(@@fetch_status <> -1)
   begin
       if(@@fetch_status <> -2)
       begin
           if(@print = '')
           begin
              set @print = @title
           end
           else
           begin
              set @print = @print + ' | ' + @title
           end
       end
  fetch next from c_cursor
  into @title
end
close c_cursor
deallocate c_cursor
print @print

성능비교는??.... =_=;;

'db' 카테고리의 다른 글

READPAST 그리고 WITH(NOLOCK)  (0) 2009.12.19
SQL Injection Blocking  (0) 2009.05.27
Mass SQL Injection 공격  (0) 2008.11.04