2017-03-15 4 views
2

OUT 매개 변수를 사용하여 테이블에 삽입 된 기본 키를 가져 오는 프로 시저를 만들었습니다.OUT 매개 변수를 프로 시저에 전달하는 것이 좋지 않습니까?

CREATE PROCEDURE spProcedureName (
    @Name VARCHAR(20) 
    ,@Place VARCHAR(20) 
    ,@InsertedId INT = 0 OUT 
    ) 
AS 
BEGIN 
    INSERT INTO TableName (
     NAME 
     ,Place 
     ) 
    VALUES (
     @Name 
     ,@Place 
     ); 

    SET @InsertedId = SCOPE_IDENTITY(); 
END; 

이 절차는 내 C# 코드에서 사용됩니다. OUT 매개 변수에서도 값을 얻습니다.

그러나 이것은 피어 리뷰되었으며 OUT 매개 변수를 사용하지 않도록 요청했습니다. 그는 다음과 같이 절차를 변경하라고했습니다.

CREATE PROCEDURE spProcedureName (
    @Name VARCHAR(20) 
    ,@Place VARCHAR(20) 
    ) 
AS 
BEGIN 

    DECLARE @InsertedId INT = 0; 
    INSERT INTO TableName (
     NAME 
     ,Place 
     ) 
    VALUES (
     @Name 
     ,@Place 
     ); 

    SET @InsertedId = SCOPE_IDENTITY(); 

    SELECT @InsertedId; 
END; 

OUT 매개 변수를 사용하는 것이 나쁜 이유를 알고 싶습니다. 저에게 알려주세요. 나는 수색했지만 아무것도 얻을 수 없었다.

추신 : 게시물의 절차는 단지 예제 일뿐입니다. 생성 된 ID는 다른 테이블에서 실제 프로 시저의 외래 키로 사용됩니다.

미리 감사드립니다.

+1

차이가 있다고 생각하지 않습니다. –

+0

@ ZoharPeled 상황에 있다면 당신은 무엇을 선택하겠습니까? 나는 어느 쪽이 옳은 길이라고 생각하니? –

+4

의견의 문제입니다. 개인적으로 필자는 매개 변수에 스칼라 결과를 유지하고 진정한 관계형 데이터를 위해 결과 집합을 예약하는 것을 선호합니다. 외관상으로는, 당신의 동료는 반대 의견이있다. 프로 시저가 다른 결과 세트를 생성하지 않는이 예제에서는 많은 차이를 만들지 않을 것입니다. –

답변

1

반환 매개 변수에서 스칼라 값을 반환하는 것과 결과 집합에서 스칼라 값을 반환하는 것의 차이는 순전히 의미 상입니다.

사용 방법을 결정하는 디자인 결정은 주로 컨텍스트뿐만 아니라 스타일 및 일관성에 의해 결정되어야합니다. 스토어드 프로 시저가 이미 결과 세트를 생성하는 경우, 리턴 매개 변수를 사용하면 응용 프로그램에 스칼라 값을 다시 전달할 수있는 편리한 f}이 될 수 있습니다. 일부 클라이언트 응용 프로그램 또는 데이터 액세스 계층은 반환 매개 변수를 처리하는 데 적합하지 않을 수 있습니다. 클라이언트 응용 프로그램을 이해하면 전체적인 디자인에 도움이 될 수 있습니다. 일관성이 또한 중요한 역할을 할 수 있습니다. 일반적으로 시스템의 저장 프로 시저가 스칼라 값에 대한 결과 집합을 반환하고 코드가 이와 같이 최적화 된 경우 데이터를 다른 방식으로 반환하는 새 저장 프로 시저를 추가하면 우아한 솔루션이 아니며 복잡성이 추가 될 수 있습니다.

전반적으로 시스템의 모든 부분과 저장 프로 시저와의 상호 작용을 이해하면 최적의 디자인 방식이됩니다.

관련 문제