0

我有一些需要年份和月份的 SP:

Create PROCEDURE Report(
    @targetYear int,
    @targetMonth int
)

并通过以下方式查询:

select sum(col) where year(dateTime) = @targetYear and month(dateTime) = @targetMonth

然后我只有一年一样的东西

Create PROCEDURE Report(
    @targetYear int
)

并像这样查询它:

select sum(col) where year(dateTime) = @targetYear

当然,逻辑比 sum(col) 更复杂

我的问题是,我如何编写这个 SP,这样逻辑就不会在两个 SP 之间重复,即使这意味着当我的意思是全年时,目标月份传递 0?

4

3 回答 3

1

我喜欢乔尔的回答,除了如果你把零作为月份传递,他的回答将不起作用。您将需要 @targetMonth=0 例如:

SELECT sum(col) 
WHERE year(dateTime) = @TargetYear AND 
(@targetMonth = 0 OR month(dateTime) = @targetMonth)
于 2009-02-12T19:57:11.863 回答
0
SELECT sum(col) 
FROM [yourtable]
WHERE year(dateTime) = @TargetYear 
    AND (@targetMonth < 0 OR month(dateTime) = @targetMonth)
于 2009-02-12T19:54:00.230 回答
0

存储过程可以有一个可选参数:

Create PROCEDURE Report( @targetYear int, @targetMonth int = null )

可以使用参数调用它,也可以不调用它:

exec Report 2009
exec Report 2009, 2 

然后在您的逻辑中检查是否为空:

SELECT sum(col) 
FROM [yourtable]
WHERE (year(dateTime) = @TargetYear and @targetMonth = null)
  OR (year(dateTime) = @TargetYear AND @targetMonth = month(dateTime))

或者

SELECT sum(col) 
FROM [yourtable]
WHERE year(dateTime) = @TargetYear 
  AND (@targetMonth = null OR year(dateTime) = @TargetYear)
于 2009-02-12T20:00:15.317 回答