DATE参数传递为' YYYY-MM-DD'没有通过存储过程正确评估?

时间:2015-03-23 23:36:18

标签: sql-server

假设:

    CREATE PROCEDURE [dbo].[sp_func]
                      @StartDate            DATE
                    , @EndDate              DATE
    AS
      select * from [TRANS] where
(@StartDate IS NULL OR [TransDate] >= @StartDate) AND (@EndDate IS NULL OR [TransDate] <= @EndDate) 

这两个:

declare @StartDate DATE = '2015-01-01'
declare @EndDate DATE = '2015-12-31'
exec dbo.sp_func @StartDate, @EndDate

而且:

declare @StartDate DATE = NULL
declare @EndDate DATE = NULL
exec dbo.sp_func @StartDate, @EndDate

...按预期返回行。

但是,这两个调用都返回0行:

exec dbo.sp_func '2015-01-01', '2015-12-31'
exec dbo.sp_func NULL, NULL

我从根本上误解了一些事情吗?据我所知,我总是把sp的传递日期称为&#39; YYYY-MM-DD&#39;绝对没有问题。

可能相关......这个:

select CAST('2015-01-01' AS DATE), CAST('2015-12-31' AS DATE)

返回:

2015-01-01          2015-12-31

鉴于此:

exec dbo.sp_func CAST('2015-01-01' AS DATE), CAST('2015-12-31' AS DATE)

返回:

Incorrect syntax near '2015-01-01'.

我觉得我正在服用疯狂的药片。

我发现了这个问题,这是愚蠢的。

示例中未显示,我的生产代码中有其他参数,其中一个是:

@JobClass VARCHAR(10)=&#39; PRODUCTION&#39;

我在测试代码中做错了就是将NULL传递给它,并且错误地认为传递给它的NULL将默认为&#39; PRODUCTION&#39;,而这种默认只发生在参数< em>根本没有传递。我当然知道。其中一天。

2 个答案:

答案 0 :(得分:1)

有几件事,我会重写整个过程,如下所示:

程序定义

CREATE PROCEDURE [dbo].[usp_Proc]  --<-- do not use sp_ 
  @StartDate DATE = NULL
, @EndDate   DATE = NULL
AS
BEGIN
 SET NOCOUNT ON;

 DECLARE @sql NVARCHAR(MAX);

SET @sql = N' select * from [TRANS] where 1 = 1 '
        +  CASE WHEN  @StartDate IS NOT NULL 
           THEN N' AND [TransDate] >= @StartDate' ELSE N' ' END
        +  CASE WHEN  @EndDate IS NOT NULL 
           THEN N' AND [TransDate] <= @EndDate  ' ELSE N' ' END

Execute sp_executesql @sql
                    ,N'@StartDate DATE,@EndDate DATE '  
                    ,@StartDate
                    ,@EndDate  
END

执行程序

 exec dbo.usp_Proc '20150101', '20151231'  --<-- Pass date in ANSI format 'YYYYMMDD'

答案 1 :(得分:0)

如何指定变量名称和值如下:

EXECUTE dbo.sp_func @StartDate='2015-01-01',@EndDate='2015-12-31'

在我的机器上工作......:)