안녕하세요
프로시저
변수: @strSN 이며 12,23,35 등의 여러개 값이 들어갈 예정
declare @strSN varchar(max)
declare @strQuery varchar(max)
Set @strQuery = select attribute, option from table1 a
inner join table2 b
on a.sn= b.sn
where a.sn in ('+@strSN+')
exec (@strquery)
sn컬럼이 클러스터 인덱스에 있는 테이블입니다.
기존 한개씩 실행하는 sp의경우
변수를 1개씩 받아는 클러스터인덱스를 타지만 느리다고합니다 . (아주 대용량 사이트긴 합니다)
그래서 다음 쿼리를 사용하려고하는데
이 쿼리는 훨씬 빠르다고 합니다. 4000개의 변수일 경우 거의 10배정도;;
그런데 보안상 불안해서 executesql 을 사용하려해도 방법이없고
혹시 추천할만한 다른 방법이 있을까요??
ㅜㅜ 머리가 터지겠네용 ㅜㅜ
Comment 1
-
catchv
2019.09.18 15:53
구분자 데이터를 임시테이블에 넣고 조인 또는 IN 조건으로 걸어서 사용하셔도 될 것 같습니다.
물론 구분자 분리와 임시테이블 INSERT에 넣는 시간이 소요되지만 동적쿼리를 사용하지 않아도 됩니다.
2016 이상을 사용하시 STRING_SPLIT 를 사용하시면 되고 이전 버전이라면 여기에 구분자 분리하는 방법(xml 사용 등)이 찾아 보시면 있습니다.
( https://docs.microsoft.com/ko-kr/sql/t-sql/functions/string-split-transact-sql?view=sql-server-2017 )
이런 형태로...
select attribute, option from table1 a
inner join table2 b
on a.sn= b.sn
where a.sn in ( SELECT value FROM STRING_SPLIT('@strSN', ',') )