2015-01-07 2 views
0

this post에 이전에 묻어 보았으며 WHEN-THEN 구조를 살펴 보았지만 실제로는 몇 가지 질문에 대답하지 않습니다. 동적 SQL을 스토어드 프로 시저로 다시 작성

buildSearchQuery.Append("SELECT * FROM Policy WHERE Field_1 = '" + param_1 + "'"); 

if (Condition 2){ 
    buildSearchQuery.Append("AND Field_2 = '" + param_2 + "' "); 
} 
if (Condition 2) 
{ 
    buildSearchQuery.Append("AND Field_3 = '" + param_3 + "' "); 
} 
... 

당신은 사진을 얻을 :

현재 코드에서 SQL 쿼리는이 같은 StringBuilder 사용하여 구축된다. 총 20 개의 매개 변수 값이 있으며, 내 작업은 저장 프로 시저를 만들고이 값을 매개 변수로 전달하는 것이 었습니다.

모든 매개 변수를 사용하여 저장 프로 시저를 만들고 거기에서 논리를 수행합니까? 그렇다면 확실하지 않습니다. 이 같은?

SELECT * FROM TABLE WHERE Field_1 = @param_1 
IF(@param_2 <> NULL) 
    AND Field_2 = param_2 
... 

이 매개 변수는 항상 값을 가질 수 없으므로 쿼리의 일부가 될 수 없습니다. 이 작업을 염두에두고 성능을 유지하는 가장 좋은 방법은 무엇입니까?

+5

읽어 보시기 바랍니다 : HTTP : //www.sommarskog. se/dyn-search.html – HLGEM

+0

고마워요, 제가 살펴 보겠습니다. – Risho

답변

4

저장 프로 시저는 3 개 개의 매개 변수 @ PARAM_1, @ PARAM_2, @ 이러한 매개 변수에 대한

기본 값이 NULL로 설정할 수 있습니다 param_3있을 것이다. 이

WHERE (@param_1 is NULL or field_1 = @param_1) 
     AND 
     (@param_2 is NULL or field_2 = @param_2) 
     AND 
     (@param_3 is NULL or field_3 = @param_3) 

OPTOIN(RECOMPILE) 

추가 OPTION(RECOMPILE) 실행 계획 쿼리이 도움이 될 것 OR 조건, 실행 때마다 재 구축과 같은 저장 프로 시저 내부

조건은 될 것입니다.

+0

테이블의 대다수 필드가'not null' 제약 조건을 가지고 있으며'Procedure or function ... '매개 변수'@param_1 '이 제공되지 않았습니다.'라는 오류가 발생했습니다. 이것은 실제 코드'AND (@State IS NULL OR [State] = @State)' – Risho

+0

@ 리사입니다. 저장 프로 시저의 경우 param1을 건너 뛰고 param2 만 넘겨 줄 수 없으므로 parma1을 NULL로 전달한 다음 param2 – radar

+0

나는 그것이 오타라고 생각했다. 질문은 원하는 레코드를 생성하지 않을 field_2로 @param_1을 전달하면됩니까? – Risho

1

이들은 모두 null 가능 매개 변수이므로 괄호 안의 OR 대신에 병합을 사용할 수 있습니다. 나는 그것이 조금 더 잘 읽는다라고 생각한다.

WHERE COALESCE (@ PARAM_1, field_1)

COALESCE (@ PARAM_2, field_2)

COALESCE (@ param_3, field_3)

관련 문제