2012. 4. 3. 10:20

저장 프로시저를 호출했는데 결과가 여러 개 나온다는 것은

'Select'문이 여러 번 동작하거나

'return'값도 온다는 의미입니다.

 

 

1. 'select'와 'return' 구분하기

필요에 따라 'Select'로 리턴하는 값을 'Return'으로 바꾸면 됩니다.

 

셀랙트(Select)는 리턴(Return)과 달라 프로시저가 종료되지 않습니다.

그러니 셀랙트로 값을 리턴하면 셀랙트가 호출된 이후 뒤에 있는 코드들도 그대로 동작합니다.

 

 

셀랙트가 여러 개 있다면 결과도 여러 개 나옵니다.

만약 호출한 저장 프로시저의 셀랙트된 내용을 받고 싶지 않다면 방법이 없는 건 아닙니다.

테이블 변수나 임시 테이블을 이용하여 저장 프로시저의 내용을 받으면 셀랙트된 내용이 리턴되지 않습니다.

(참고 : [MSSQL] 저장프로시저에서 테이블(Table) 변수 사용하기 , [MSSQL] 저장프로시저에서 임시 테이블 사용하기 )

 

 

2. 용도 구분

셀랙트와 리턴을 명확하게 구분하지 않고 사용하다 보면 많이 발생하는 문제입니다.

'return'은 저장 프로시저가 종료될 때 결과

즉, 최종 결과물이나 종료된 사유를 전달하는 게 좋습니다.

 

 

저장 프로시저를 작성할때 셀랙트를 한 후 리턴으로 프로시저를 종료하는 경우를 볼 수 있습니다.

if @nTemp == 1
Begin
	Select 1
	Return
End

Select 0
Return

위 코드는 한가지 출력방식으로 출력되는 것만 확인하면 되기 때문에 쓸만하긴 합니다.

하지만 이것은 그다지 좋은 방법이 아닌 것이....

 

실제 출력값(여기서는 셀랙트)과 프로시저의 동작상태를 나타내는 리턴이 한가지 변수로 전달되고 있는 셈이기 때문에 그렇습니다.

이럴 바에는 차라리 아웃풋(Output)를 이용하는 편이 좋죠.

 

위와 같이 프로시저의 처리상태 결과를 리턴하는 경우라면 아웃풋보다도 리턴이 더 맞습니다.

뭐... 이런 것들은 저장 프로시저를 만들기 전에 일관성을 유지할 수 있도록 미리 정해두는 것이 좋죠.

if @nTemp == 1
Begin
	Return 1
End

Return 0

 

3. 'return'과 'select' 분리해서 받기

리턴으로 값을 받는 방법은 셀랙트로 받는 방법과 다릅니다.

하지만 두 개를 같이 전달해주므로 로직의 일관성 유지에도 좋죠.

 

닷넷(.Net)의 경우 쉽게 두 개의 값을 분리해서 받을 수 있습니다.

( 참고 : [.Net] 저장프로시저의 return을 SqlCommand로 받아오는 방법 )

 

 

 

마무리

물론 이 포스팅에서 하는 소리가 항상 정답은 아닙니다. ㅎㅎㅎ

결국 "설계를 잘해라"뭐 이런 거 아니겠습니까?

ㅎㅎ