sql sp год или год и месяц - PullRequest
0 голосов
/ 12 февраля 2009

У меня есть 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

Конечно, логика сложнее, чем сумма (столбец)

У меня вопрос, как я могу написать этот SP, чтобы логика не повторялась для двух SP, даже если это означает пропуск 0 для целевого месяца, когда я имею в виду целый год?

Ответы [ 3 ]

1 голос
/ 12 февраля 2009

Мне нравится ответ Джоэла, за исключением того, что он не сработает, если вы укажете ноль в качестве месяца. Вам понадобится @ targetMonth = 0, например:

SELECT sum(col) 
WHERE year(dateTime) = @TargetYear AND 
(@targetMonth = 0 OR month(dateTime) = @targetMonth)
0 голосов
/ 12 февраля 2009

Хранимая процедура может иметь необязательный параметр:

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)
0 голосов
/ 12 февраля 2009
SELECT sum(col) 
FROM [yourtable]
WHERE year(dateTime) = @TargetYear 
    AND (@targetMonth < 0 OR month(dateTime) = @targetMonth)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...