2014-07-08 2 views
3

기존 ASP.NET 응용 프로그램에서 작업하고 있습니다. 현재 응용 프로그램은 많은 인라인 쿼리를 사용합니다. 이제는 모든 쿼리를 저장 프로 시저로만 다시 작성하려고합니다. 내 문제가인라인 SQL을 저장 프로 시저로 변환

,이 쿼리는 매우 "동적"이며 쿼리는 예를 들어, 다른 if...else 조건에 따라 연결됩니다 :

string query = "Select * from EmpTable WHERE EmpType ='ACTIVE'"; 

if (conditionA == true) 
query += "AND ID = 12345 "; 

if (conditionB == true) 
query += "AND Dept = 'Finance' "; 

else 
query += "AND Dept <> 'Finance' "; 

if (conditionC == true) 
query += "Order by EmpID"; 

else if (ConditionD == true) 
query += "Order by Dept"; 

그들은 또한 동적 쿼리를 사용하지 않도록합니다. 내 옵션은 무엇입니까?

편집 : 저장된 프로 시저를 사용하여 동적 쿼리를 작성할 수도 있다는 것을 알고 있습니다. 다른 "덜 고통스러운"옵션이 무엇인지 궁금합니다.

+6

유지 보수의 악몽 – Steve

+0

정확하게 @ 스티브! –

+0

음, 조건을 매개 변수로 SP에 전달하고 여기에 동적 SQL을 빌드 할 수 있습니다. 최선의 방법은 아니지만 가장 고통스럽지 않습니다. –

답변

3

원래 매개 변수와 동일한 쿼리를 만들려면 IsNull 및/또는 When 절을 사용해야합니다.

또는 sproc 자체에서 쿼리를 동적으로 만들거나 각 순열에 대한 쿼리를 만들면됩니다. 반드시 재미있는 것은 아니지만 영리하지만 작동하고 미래에 유지하기가 더 쉬워집니다. 특히 sprocs의 향후 리팩토링을위한 디딤돌으로 사용할 수있을 때 더욱 그렇습니다.

편집 : 거기에 모두 sprocs로 변환하는 이유가 하나 더 있습니다. 미래의 개발자가 와서 SQL을 추가 할 때, 그들은 관습을 따르고 새로운 sproc를 만들 것입니다. 당신의 코드가 동적 SQL에 흩어져있는 이유 중의 하나는 동적 SQL에 이미 흩어져 있기 때문입니다. 어쩌면 시간이 지남에 따라 성능을 향상시킬 수 있습니다 (레거시, 각 변환의 상단에을 수정해야 함). 그러면 디자인을 직접 수정하게됩니다.

+0

이것은 내 유일한 옵션이라고 생각합니다. –

+0

한 번에 한 번 물어보십시오 ... – gbjbaanb

+0

@ C.J. 이것은 가장 세련된 솔루션은 아니지만 귀하의 요구 사항을 감안할 때 gbjbaanb의 솔루션은 분명히 당신이보고 있어야하는 곳이라고 생각합니다. 특히 유지 보수성을위한 두 번째 단락. –

관련 문제