簡體   English   中英

存儲過程使用默認參數

[英]Stored procedure with default parameters

我試圖基於我用預定義的參數編寫的查詢創建存儲過程。

重構到創建存儲過程並執行存儲過程時,它表明未提供參數。 誰能告訴我為什么?

我知道我已經錯過了一些必要的東西但是在弄亂了代碼之后我已經達到了需要專家幫助的程度。

這是我的代碼(縮寫):

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,Level 16,State 4,Procedure test,Line 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'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM