web-dev-qa-db-ja.com

既定のパラメーターを持つストアドプロシージャ

定義済みのパラメーターを使用して作成したクエリに基づいてストアドプロシージャを作成しようとしています。

ストアドプロシージャの作成に再構築し、ストアドプロシージャを実行すると、パラメータが提供されなかったことが示されます。誰に理由を教えてもらえますか?

不可欠なものを見逃したことは知っていますが、コードをいじってから、専門家の助けが必要になりました。

これは私のコードです(短縮):

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)

プロシージャを実行すると、次の結果が得られます。

メッセージ201、レベル16、状態4、手順テスト、行0
プロシージャまたは関数 'test'には、指定されていないパラメーター '@StartDate'が必要です。

前もって感謝します。

19
TSQL_Newbie

定義済みのパラメーターを使用して作成しました

コード内のどこかに論理的に「事前定義」されていません。ただし、SPの引数としてデフォルト値はなく、必須です。これらのパラメーターを明示的に渡さないようにするには、SP定義でデフォルト値を定義する必要があります。

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

NULLまたは空の文字列またはより賢明なもの-あなた次第。 SPの最初の行でこれらの引数の値を上書きしているため、問題はありません。

これで、引数を渡さずに呼び出すことができます。 exec dbo.TEST

31
Ivan Starostin

これは2つの方法のいずれかで行います。 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'を実行します

1
jellz77