가끔 작업을 하다보면 커서를 사용해야 할 경우가 있다.
대표적인 경우가... 루프문을 사용해서 데이터를 추출하고 싶을 경우겠지요... 아닌가?? =_=;
나는 종종 커서를 사용해왔었다...
허나.. 커서 및 임시 테이블의 경우 최대한 자제를 해야 된다고... 어디선가 많이 본 기억이...
커서의 경우 서버 자원을 많이 낭비하게 되며 커서로 할 수 있는 건 임시 테이블이나
테이블 변수로도 모두 처리가 가능하단다...
그리하여 현재 회사프로젝트 커서사용부분을 모두 바꾸기로 결심...
사용데이터베이스 : PUBS
사용테이블 : TITLES
원하는 결과값은
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 |