programing

저장 프로시저에서 OUTPUT 파라미터(옵션)를 사용할 수 있습니까?

jooyons 2023. 5. 20. 10:45
반응형

저장 프로시저에서 OUTPUT 파라미터(옵션)를 사용할 수 있습니까?

여러 테이블에 값을 삽입하기 때문에 입력 및 출력 매개 변수가 많은 저장 프로시저가 있습니다.경우에 따라 저장된 proc가 단일 테이블에만 삽입됩니다(입력 매개 변수에 따라 다름).여기에 설명할 조롱된 시나리오가 있습니다.

테이블 / 데이터 개체:

사람인

Id
Name
Address

이름.

Id
FirstName
LastName

주소.

Id
Country
City

사람을 삽입하는 저장 프로시저가 있다고 칩시다.▁the에 하지 않습니다.Address데이터베이스에 있는 테이블.

따라서 저장 프로시저를 호출하는 코드를 생성할 때 다음을 추가할 필요가 없습니다.Address매개 변수위해서INPUT매개 변수 SQL Server를 사용하면 기본값을 제공할 수 있기 때문에 괜찮습니다.하지만 그것을 위하여.OUTPUT매개 변수 저장 프로시저에서 오류가 발생하지 않도록 옵션으로 설정하려면 어떻게 해야 합니까...

절차 또는 기능 '사용자_InsertPerson'에는 제공되지 않은 매개 변수 '@AddressId'가 필요합니다.

입력 및 출력 매개 변수를 모두 기본값으로 할당할 수 있습니다.이 예제에서는 다음을 수행합니다.

CREATE PROCEDURE MyTest
  @Data1 int
 ,@Data2 int = 0
 ,@Data3 int = null output

AS

PRINT @Data1
PRINT @Data2
PRINT isnull(@Data3, -1)

SET @Data3 = @Data3 + 1

RETURN 0

첫 번째 매개 변수는 필수이고 두 번째 및 세 번째 매개 변수는 선택 사항입니다. 호출 루틴에서 설정하지 않으면 기본값이 할당됩니다.다른 값과 설정을 사용하여 SSMS에서 다음 테스트 호출 루틴을 사용하여 이 모든 것이 어떻게 작동하는지 확인해 보십시오.

DECLARE @Output int

SET @Output = 3

EXECUTE MyTest
  @Data1 = 1
 ,@Data2 = 2
 ,@Data3 = @Output output

PRINT '---------'
PRINT @Output

출력 매개 변수와 기본값이 서로 잘 작동하지 않습니다!이것은 SQL 10.50.1617(2008 R2)에서 가져온 것입니다. 구조가 마법처럼 한다고 속지 마세요.SET(내 동료가 그랬던 것처럼) 당신을 대신하여 그 가치를!

SP는 "장난감" SP를 합니다.OUTPUT이든 기본값이든, " " " " " 입니다.NULL.

CREATE PROCEDURE [dbo].[omgwtf] (@Qty INT, @QtyRetrieved INT = 0 OUTPUT)
AS
IF @QtyRetrieved = 0
BEGIN
    print 'yay its zero'
END
IF @QtyRetrieved is null
BEGIN
    print 'wtf its NULL'
END
RETURN

되지 않은 값 초되지않값예은화기예값▁(▁ani)을 전송하는 :NULL) 의OUTPUT당신은 정말로NULL에 있습니다.0해당 매개 변수에 대해 뭔가 전달되었습니다.

declare @QR int
exec [dbo].[omgwtf] 1, @QR output
print '@QR=' + coalesce(convert(varchar, @QR),'NULL')

출력:

wtf its NULL
@QR=NULL

으로 명적으추경우할가를 하면,SET받는 사람으로부터 받는 것:

declare @QR int
set @QR = 999
exec [dbo].[omgwtf] 1, @QR output
print '@QR=' + coalesce(convert(varchar, @QR),'NULL')

그리고 (놀랍게도) 출력:

@QR=999

는 " , 지 만 변 매 전 가 고 되 SP 인 조 않 습 니 았 다 SP 지 를 취 하 치 적 명 시 개 대 에 달 수 다 음 해 ▁to ▁again ▁explicit ▁no ▁action ▁spSET

추가SET의 시대의OUTPUTSP의 매개 변수(사용자가 해야 하는 것처럼), 그러나 호출자로부터 아무것도 설정하지 마십시오.

ALTER PROCEDURE [dbo].[omgwtf] (@Qty INT, @QtyRetrieved INT = 0 OUTPUT)
AS
IF @QtyRetrieved = 0
BEGIN
    print 'yay its zero'
END
IF @QtyRetrieved is null
BEGIN
    print 'wtf its NULL'
END
SET @QtyRetrieved = @Qty
RETURN

이제 실행 시:

declare @QR int
exec [dbo].[omgwtf] 1234, @QR output
print '@QR=' + coalesce(convert(varchar, @QR),'NULL')

출력은 다음과 같습니다.

wtf its NULL
@QR=1234

이것이 다음에 대한 "표준" 동작입니다.OUTPUT매개 변수 처리(SP).

이제 플롯 트위스트:기본값을 "활성화"할 수 있는 유일한 방법은 매개 변수를 전혀 전달하지 않는 것입니다. IMHO는 이 매개 변수가 다음과 같이 설정되어 있기 때문에 거의 의미가 없습니다.OUTPUT이는 수집해야 하는 "중요한" 것을 반환하는 것을 의미합니다.

declare @QR int
exec [dbo].[omgwtf] 1
print '@QR=' + coalesce(convert(varchar, @QR),'NULL')

는 다음과 같은 출력을 제공합니다.

yay its zero
@QR=NULL

그러나 이것은 SP의 출력을 캡처하지 못합니다. 아마도 처음부터 SP의 목적일 것입니다.

IMHO 이 기능 조합은 의심스러운 구성입니다. 코드 냄새(휴!)라고 생각합니다.

기본값을 에 추가할 수 있을 것 같습니다.OUTPUT다음과 같은 매개 변수:

@AddressId int = -1 Output

이후 가독성 측면에서 열악한 것으로 보입니다.AddressId엄격하게 의도된 것은OUTPUT변수.하지만 그것은 효과가 있다.당신이 더 좋은 해결책이 있다면 저에게 알려주세요.

필립의 말에 덧붙여,

SQL 서버 데이터베이스에 다음과 같은 저장 프로시저가 있었습니다.

dbo.<storedProcedure>
(@current_user char(8) = NULL,
@current_phase char(3) OUTPUT)

그리고 저는 제 닷넷 코드에서 다음과 같이 불렀습니다.

 DataTable dt = SqlClient.ExecuteDataTable(<connectionString>, <storedProcedure>);

시스템을 받는 중이었습니다.Data.SqlClient.SqlException:프로시저 또는 함수는 제공되지 않은 '@current_phase' 매개 변수를 예상합니다.

저는 또한 이 기능을 프로그램의 다른 곳에서 사용하고 있으며 매개 변수를 전달하고 출력 매개 변수를 처리하고 있습니다.현재 통화를 수정할 필요가 없기 때문에 저장 프로시저를 변경하여 출력 매개 변수도 선택 사항으로 만들었습니다.

이제 다음과 같이 표시됩니다.

dbo.<storedProcedure>
(@current_user char(8) = NULL,
@current_phase char(3) = NULL OUTPUT)

SQL 문이 아닌 저장 프로시저를 실행 중이므로 SQL 명령의 명령 유형을 저장 프로시저로 설정해야 합니다.

cmd.CommandType = CommandType.StoredProcedure;

여기서 찍은.

또한 해당 오류를 제거한 후에는 SQL을 사용할 수 있습니다.nvl()NULL 값이 발생할 때 표시할 항목을 지정하는 기능입니다.

질문을 제대로 처리하지 못해 죄송합니다...당신을 오해했나 봅니다.여기 nvl의 예가 있는데, 조금 더 잘 다룰 수 있을까요?

select NVL(supplier_city, 'n/a')
from suppliers;

위의 SQL 문은 다음과 같은 경우 'n/a'를 반환합니다.supplier_city필드에 null 값이 있습니다.그렇지 않으면 다음을 반환합니다.supplier_city가치.

언급URL : https://stackoverflow.com/questions/3267523/can-i-have-an-optional-output-parameter-in-a-stored-procedure

반응형