programing

기본 매개 변수가 있는 저장 프로시저

bestprogram 2023. 8. 20. 12:20

기본 매개 변수가 있는 저장 프로시저

미리 정의된 매개 변수를 사용하여 작성한 쿼리를 기반으로 저장 프로시저를 생성하려고 합니다.

저장 프로시저를 생성하도록 재구성하고 저장 프로시저를 실행하면 매개 변수가 제공되지 않았다고 표시됩니다.누가 이유를 말해줄 수 있나요?

저는 제가 중요한 것을 놓쳤다는 것을 알고 있지만, 코드를 엉망으로 만든 후에 전문가들의 도움이 필요한 지경에 이르렀습니다.

다음은 내 코드입니다(약칭).

Alter Procedure [Test]
    @StartDate AS varchar(6), 
    @EndDate AS varchar(6)
AS
    Set @StartDate = '201620' --Define start YearWeek
    Set @EndDate  = (SELECT CAST(DATEPART(YEAR,getdate()) AS varchar(4)) + CAST(DATEPART(WEEK,getdate())-1 AS varchar(2)))

    SELECT 
        *
    FROM
        (SELECT DISTINCT 
             [YEAR], [WeekOfYear] 
         FROM 
             [dbo].[DimDate] 
         WHERE 
             [Year] + [WeekOfYear] BETWEEN @StartDate AND @EndDate) dimd
    LEFT JOIN 
        [Schema].[Table1] qad ON (qad.[Year] + qad.[Week of the Year]) = (dimd.[Year] + dimd.WeekOfYear)

절차를 실행하면 다음과 같은 메시지가 나타납니다.

Msg 201, 레벨 16, 상태 4, 절차 테스트, 라인 0
프로시저 또는 함수 'test'는 제공되지 않은 매개 변수 '@StartDate'를 예상합니다.

미리 정의된 매개변수를 사용하여 작성했습니다.

코드 내부 어딘가에서 논리적으로 "사전 정의"되지 않습니다.그러나 SP의 인수로는 기본값이 없으며 필수입니다.이러한 매개 변수가 명시적으로 전달되지 않도록 하려면 SP 정의에서 기본값을 정의해야 합니다.

Alter Procedure [Test]
    @StartDate AS varchar(6) = NULL, 
    @EndDate AS varchar(6) = NULL
AS
...

NULL 또는 빈 문자열 또는 더 합리적인 것은 사용자에게 달려 있습니다.SP의 첫 번째 줄에서 해당 인수의 값을 덮어쓰므로 문제가 되지 않습니다.

이제 인수를 전달하지 않고 호출할 수 있습니다.exec dbo.TEST

저는 두 가지 방법 중 하나를 택하겠습니다.당신이 당신의 t-sql 코드에서 시작일과 종료일을 설정하고 있기 때문에, 나는 저장된 프로시저에 파라미터를 요청하지 않을 것입니다.

옵션 1

Create Procedure [Test] AS
    DECLARE @StartDate varchar(10)
    DECLARE @EndDate varchar(10)
    Set @StartDate = '201620' --Define start YearWeek
    Set @EndDate  = (SELECT CAST(DATEPART(YEAR,getdate()) AS varchar(4)) + CAST(DATEPART(WEEK,getdate())-1 AS varchar(2)))

SELECT 
*
FROM
    (SELECT DISTINCT [YEAR],[WeekOfYear] FROM [dbo].[DimDate] WHERE [Year]+[WeekOfYear] BETWEEN @StartDate AND @EndDate ) dimd
    LEFT JOIN [Schema].[Table1] qad ON (qad.[Year]+qad.[Week of the Year]) = (dimd.[Year]+dimd.WeekOfYear)

옵션 2

Create Procedure [Test] @StartDate varchar(10),@EndDate varchar(10) AS

SELECT 
*
FROM
    (SELECT DISTINCT [YEAR],[WeekOfYear] FROM [dbo].[DimDate] WHERE [Year]+[WeekOfYear] BETWEEN @StartDate AND @EndDate ) dimd
    LEFT JOIN [Schema].[Table1] qad ON (qad.[Year]+qad.[Week of the Year]) = (dimd.[Year]+dimd.WeekOfYear)

그럼 실행exec test '2016-01-01','2016-01-25'

언급URL : https://stackoverflow.com/questions/38149156/stored-procedure-with-default-parameters