2017-09-14 389 views
1

我试图将默认值@Day设置为当天。但是,我在初始DATEADD(Day, DATEDIFF(Day, 0, GETDATE()), 0)和其下的所有@Day s上遇到了一些错误。我认为@Day DateTime下的ALTER过程中声明@Day但我得到的错误:设置SQL Server存储过程的默认参数

Must declare the scalar variable "@Day"

任何人都知道该怎么办?

ALTER PROCEDURE [dbo].[InsertWeeklyRuns] 
    @Day DateTime = DATEADD(Day, DATEDIFF(Day, 0, GETDATE()), 0) 
AS 
BEGIN 
    SET NOCOUNT ON 

    DECLARE @Enddate DATETIME 
    DECLARE @StartDate DATETIME 
    DECLARE @F1Runs INT 
    DECLARE @F2Runs INT 
    DECLARE @F3Runs INT 
    DECLARE @F1Alarms INT 
    DECLARE @F2Alarms INT 
    DECLARE @F3Alarms INT 

    SET @Day = DATEADD(dd, DATEDIFF(dd, 0, @Day), 0) 

    SET @Enddate = CASE 
         WHEN @Day > DATEADD(Day, DATEDIFF(Day, 0, GETDATE()), 0) 
         THEN DATEADD(Day, DATEDIFF(Day, 0, GETDATE()), 0) 
         ELSE DATEADD(Day, 1, @Day) 
        END 

    SET @StartDate = @Enddate - 7 

感谢

+0

有些东西似乎有点过这里。你正在设置你的变量,然后用case表达式检查它的值。既然你只是设置它,使用case表达式没有意义,它总是会返回第一个值。 –

+0

您不能指定一个不确定的默认值(例如'getdate()'或其任何变体)。相反,将默认设置为“null”。然后在你的proc体内,如果'@ day'为空,将它设置为你想要的默认值。 'select @Day = isnull(@day,cast(getdate()as date))' – Xedni

+0

@SeanLange All'Set @Day = DATEADD(dd,DATEDIFF(dd,0,@Day),0)从任何'@ Day'设定的时间。例如,如果某人设置了“@Day = 5/20/16 4:57”,则“@Day =设置@Day = DATEADD(dd,DATEDIFF(dd,0,@Day),0)'将带走4: 57。如果'@ Day'被设置为将来的某一天,案例陈述就会发挥作用。 – MadelineK

回答

0

这应该是你所期望的工作:

CREATE PROCEDURE [dbo].[InsertWeeklyRuns] 
    @Day DateTime 
AS 
BEGIN 

SET NOCOUNT ON 

Declare @Enddate Datetime 
Declare @StartDate Datetime 
Declare @F1Runs Int 
Declare @F2Runs Int 
Declare @F3Runs Int 
Declare @F1Alarms Int 
Declare @F2Alarms Int 
Declare @F3Alarms Int 
DECLARE @today date = CAST(GETDATE() AS date); 

IF @Day IS NULL 
    Set @Day = @today 

Set @Enddate = CASE WHEN @Day >= @today THEN @today ELSE DATEADD(Day, 1, @Day) END 

Set @StartDate = @Enddate - 7 
END