定義済みのパラメーターを使用して作成したクエリに基づいてストアドプロシージャを作成しようとしています。
ストアドプロシージャの作成に再構築し、ストアドプロシージャを実行すると、パラメータが提供されなかったことが示されます。誰に理由を教えてもらえますか?
不可欠なものを見逃したことは知っていますが、コードをいじってから、専門家の助けが必要になりました。
これは私のコードです(短縮):
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'が必要です。
前もって感謝します。
定義済みのパラメーターを使用して作成しました
コード内のどこかに論理的に「事前定義」されていません。ただし、SPの引数としてデフォルト値はなく、必須です。これらのパラメーターを明示的に渡さないようにするには、SP定義でデフォルト値を定義する必要があります。
Alter Procedure [Test]
@StartDate AS varchar(6) = NULL,
@EndDate AS varchar(6) = NULL
AS
...
NULLまたは空の文字列またはより賢明なもの-あなた次第。 SPの最初の行でこれらの引数の値を上書きしているため、問題はありません。
これで、引数を渡さずに呼び出すことができます。 exec dbo.TEST
これは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'
を実行します