인라인 테이블 값 함수를 사용하면 성능이 향상됩니다.
참조 :
이 스칼라 함수 t의 인라인 테이블 값 함수 버전입니다 모자는
stuff()
with select ... for xml path ('')
method of string concatenation 사용합니다.
create function dbo.fn_get_multiple_assigness_itvf (
@timelineid int
, @milstoneid int
, @taskid int
) returns table as return (
select Assignees = stuff((
select ',' + firstname + ' ' + lastname
from casetimelinepeople ctp
inner join userdetail ud
on ctp.peopleuserid=ud.userid
where casetimelineid = @timelineid
and templatemilestoneid = @milstoneid
and (templatetaskid = @taskid
or (@taskid = 0 and templatetaskid is null)
)
and ctp.isdeleted=0
for xml path (''), type).value('.','nvarchar(max)')
,1,1,'')
)
go
rextester 데모 : http://rextester.com/UZTJS46485
테스트 설정 :
create table casetimelinepeople (
casetimelineid int
, peopleuserid int
, templatemilestoneid int
, templatetaskid int
, isdeleted bit not null default 0
);
insert into casetimelinepeople values
(1,1,1,null,0)
,(1,2,1,null,0)
,(1,3,1,null,0)
,(1,2,1,1,0)
,(1,3,1,1,0)
create table userdetail (
userid int not null
, firstname varchar(32) not null
, lastname varchar(32) not null);
insert into userdetail values
(1, 'Some', 'One')
,(2, 'Avinash', 'Raikwar')
,(3, 'Sql','Zim');
go
그리고 인라인 테이블을 쿼리 반환 함수 그래서 같은 :
select *
from dbo.fn_get_multiple_assigness_itvf(1,1,0)
반환
012 3,516,
+----------------------------------+
| Assignees |
+----------------------------------+
| Some One,Avinash Raikwar,Sql Zim |
+----------------------------------+
select *
from dbo.fn_get_multiple_assigness_itvf(1,1,1)
반환 :
+-------------------------+
| Assignees |
+-------------------------+
| Avinash Raikwar,Sql Zim |
+-------------------------+
쿼리의 각 행에 대해 함수를 호출 할 cross apply()
사용 :
select *
from casetimelinepeople ctp
cross apply dbo.fn_get_multiple_assigness_itvf(
ctp.casetimelineid
, ctp.templatemilestoneid
, ctp.templatetaskid
) x
반환 :
+----------------+--------------+---------------------+----------------+-----------+----------------------------------+
| casetimelineid | peopleuserid | templatemilestoneid | templatetaskid | isdeleted | Assignees |
+----------------+--------------+---------------------+----------------+-----------+----------------------------------+
| 1 | 1 | 1 | NULL | False | Some One,Avinash Raikwar,Sql Zim |
| 1 | 2 | 1 | NULL | False | Some One,Avinash Raikwar,Sql Zim |
| 1 | 3 | 1 | NULL | False | Some One,Avinash Raikwar,Sql Zim |
| 1 | 2 | 1 | 1 | False | Avinash Raikwar,Sql Zim |
| 1 | 3 | 1 | 1 | False | Avinash Raikwar,Sql Zim |
+----------------+--------------+---------------------+----------------+-----------+----------------------------------+
SELECT를 향상시킬 대안이별로 없습니다. 테이블에 참조 된 필드의 일부 INDEX를 추가하면 도움이 될 수 있습니다. – Galcoholic
당신은'WHERE COALESCE (TEMPLATETASKID, 0) = @ TASKID'에 의해 if/else를 피할 수 있습니다 (또는 조건에서 일반 OR) – joop
감사합니다. Galcoholic. 색인 생성이 누락되었습니다 –