2015-01-05 1 views
1

저희 회사에서는 4 가지 유형의 간단한 저장 프로 시저 (삽입, 업데이트, 삭제, 선택)를 사용하고 있습니다. 데이터베이스 그룹은 모든 단일 저장 프로 시저가 업데이트/삭제/삽입 저장 프로 시저 유형에 대한 반환 값에 "오류 코드"를 포함해야한다는 규칙을 유지합니다.저장 프로 시저 우수 사례에서 오류 코드 값을 반환하고 있습니까?

는 설명하기 위해 우리가 기존 ASP/VB6.0을 사용할 때이 규칙은 나이를 거슬러 올라간다

-------------------  
--INSERT sp example 
------------------- 
INSERT INTO dbo.SomeTable(..) VALUES(...) 

if @@error <> 0 
    return -1 
return 0 

------------------- 
--UPDATE sp example 
------------------- 
declare 
@errsql int 
@updcount int 

update dbo.SomeTable set foo = @bar 

select @errsql = @@error, @updcount = @@rowcount 
if @errSQL <> 0  
    return -1 
if @updcount < 1 
    return -2 
return 0  

------------------- 
--DELETE sp example 
------------------- 
delete from dbo.SomeTable where ... 

if @@error <> 0 
    return -1 
return 0 

을; 그러나 오랫동안 우리 플랫폼은 순수 .NET이며 SQL 측의 오류 (기본 키 위반/고유 인덱스 위반 등)는 .NET 예외로 응용 프로그램에 전송되므로이 패턴을 따르는 것이화물 컬트 프로그래밍 업데이트 검사 행 개수가 일부 시나리오에서는 유용 할 수 있습니다. 여전히 데이터베이스 그룹이 아니라 응용 프로그램 개발자가 주도해야합니다. 결국에는 응용 프로그램에서 반환 코드를 확인해야만합니다. :)

제 질문은 -이 연습에서는 어떤 이점이 있습니까? 아니면 고전적인 cargo 컬트 프로그래밍 예제입니까?

+0

목표가 가능한 유용한 오류 값을 상수로 대체하는 것으로 흥미 롭습니다. 그리고 try/catch는 사용하지 않습니다. 또는 기타 도움이되는 출력 (예 : 대부분의 경우 0보다 커야하는 삭제 된 행 수입니다. 유용한 진단 정보를 제공하기 위해'RaIsError'를 사용하는 것을 선호합니다. (우리는 마이크로 소프트의 또 다른 모음을 사기를 원합니까?) – HABO

+2

왜 'RAISERROR'를 사용하지 않습니까? –

+0

@SriramSakthivel - SQL에서 .NET으로 예외를 throw하는 방법이 아닙니다. "select 이외의 모든 단일 저장 프로 시저가 오류 코드를 반환해야합니다"및 해당 유효성 –

답변

3

프로젝트의 나머지 부분에서 예외를 사용하는 경우 예외가 있어야한다고 말하고 싶습니다. RAISEERROR (http://msdn.microsoft.com/en-us/library/ms178592.aspx) SQL 절이 있으므로 해당 저장 프로 시저 내에서 예외를 발생시킬 수 있습니다.

RAISEERROR의 심각도는 예외로 제기해야합니다 (http://msdn.microsoft.com/en-us/library/ms164086.aspx을 확인하는 것이 좋습니다). TRY/CATCH SQL 블록에서 작동하는 오류가 발생할 경우 예외가 발생합니다.