database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
ㆍMS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MS-SQL Q&A 6822 게시물 읽기
No. 6822
SP실행시 인자값에 따라서 select구문에 if을 사용하고 십습니다.
작성자
선이
작성일
2014-06-11 16:55ⓒ
2014-06-11 16:56ⓜ
조회수
8,246

요즘 MS SQL떔시 눈 튀어나올것 같습니다~

SP를 만들려고 하는데

예를 들면 exec sp_test  '구분','차종','업체'   이렇게 인자값 3개를 주고

차종과 업체는 있을수도 있고 없을 경우도 있어서

create procedure sp_test
@gubun nvarchar(10)  /*구분*/
,@car_type nvarchar(20)  /*차종*/
,@seller_name nvarchar(50)  /*업체*/
as

select * from table a, table b

where a.code = b.code

if (len(@car_type) > 0) and a.car_type = @car_type

if (len(@seller_name) > 0) and b.seller_name = @seller_name

이런식으로 select 조건문 안에 if 구문을 쓸수 있을까요?

아니면 if을 밖을로 빼고 select문을 각각 넣어는 방법밖에는 없나요??

이 글에 대한 댓글이 총 4건 있습니다.

select * from table a, table b

where a.code = b.code
AND ( ISNULL( @car_type, '' ) = '' OR a.car_type = @car_type )
AND ( ISNULL( @seller_name, '' ) = '' OR b.seller_name = @seller_name )
;
-- 단, 위의 쿼리는 캐쉬된 실행 계획 때문에 성능 저하를 발생시킬 수 있으므로 성능까지도 고려하신다면 가변 인자가 꼴랑 2개 뿐이므로 4개(둘 다 있는거, 차종만 있는거, 업체만 있는거, 둘 다 없는거)의 SELECT문을 사용하시는 것을 추천드립니다.
우욱님이 2014-06-11 17:58에 작성한 댓글입니다. Edit

우욱님!!!! 감사드립니다.

워낙 급했던 문제라서

우선

AND (CASE WHEN (len(@car_type) > 0) THEN B.CAR_TYPE ELSE '' END)  = @car_type

AND (CASE WHEN (len(@seller_name) > 0) THEN dbo.GETVENDORNAME(C.SELLER_CODE) ELSE '' END) = @seller_name

이런식으로 구현해버렸습니다.

이렇게 해도 성능 저하인건가요?

지금은 데이터가 별로 없어서 성능에는 문제가 없을것 같지만....앞으로는 늘어나겠죠^^?

선이님이 2014-06-11 19:42에 작성한 댓글입니다. Edit

제가 제시해드린 방법과 크게 차이는 없고요,

성능 저하가 발생할 수 있는 부분은 예를 들어 처음 실행될때 차종과 업체가 주어지지 않았다면 프로시저는 full scan하는 것으로 실행 계획을 만들어 내게 됩니다. 이후 차종이 주어져서 index를 이용해서 더 빠르게 수행될 수 있음에도 불구하고 처음 만들었던 실행계획인 full scan하여 select를 수행하게 되는 문제를 말씀드린 것입니다.

 

이럼에도 불구하고... GETVENDORNAME()이라는 함수를 사용하면 seller_code에 매번 적용을 하기 위해서 함수가 실행되어 더 심각한 성능 저하를 일으킬 수 있는 문제가 있어보이고, 이러한 문제의 경우 join으로 해결하시는 것을 추천드립니다.

우욱님이 2014-06-12 07:29에 작성한 댓글입니다. Edit

자세한 답변 감사드립니다.

GETVENDORNAME()은 쓰지 않는것으로 했습니다.

순수히 코드값만 받기로 했습니다.

제가 보여드린 쿼리가 일부분만 추린거라서 원래 select문은 좀 더 깁니다..^^;;;

그래도 전체 로직이 완료되면

앞에 답변주신것 처럼 각각 select하는 구문으로 변경하도록 하겠습니다.

감사합니다.

좋은 하루 보내세요^^

선이님이 2014-06-12 12:13에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
6825세로로 나열된 등급을 가지고 점수대비 등급을 표시하고 싶습니다. [4]
열공
2014-06-24
7384
6824[질문] 프로시져 sql management studio 실행과 웹 실행의 차이? [3]
조성배
2014-06-18
7732
6823트리거 쿼리 간략하게 정리
트리거
2014-06-16
7126
6822SP실행시 인자값에 따라서 select구문에 if을 사용하고 십습니다. [4]
선이
2014-06-11
8246
6821자식 로우 찾기 쿼리? [3]
우세연
2014-06-06
7375
6820주기적으로 속도 느림 [1]
이경미
2014-06-05
7935
6819DB 커넥션 실패.. 질문드립니다. [2]
최뭉뭉
2014-06-02
7345
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.053초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다