假设:
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>根本没有传递。我当然知道。其中一天。
答案 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'
在我的机器上工作......:)