У меня был предикат, который повторялся во многих разных предложениях WHERE, поэтому я «умно» преобразовал его в функцию со скалярным значением.
CREATE FUNCTION dbo.IsCurrent
(
@FromDate DATE,
@ToDate DATE,
@AsOfDate DATE
)
RETURNS INT
AS
BEGIN
DECLARE @Today DATE;
SET @Today = COALESCE(@AsOfDate, GETDATE());
RETURN
CASE
WHEN @Today BETWEEN ISNULL(@FromDate,'1900-01-01') AND ISNULL(@ToDate, DATEADD(dd, 1, @Today))
THEN 1
ELSE 0
END;
END
Как видите, функция ожидает передачи значений NULL для любого из параметров и правильно их обрабатывает. Он всегда будет выдавать либо 1, либо 0.
Но когда я вызываю эту функцию, передавая в качестве одного из параметров столбец, допускающий значение NULL, я получаю предупреждение SR0007 от анализа кода:
SR0007 : Microsoft.Rules.Data : Столбцы, допускающие значение NULL, могут привести к тому, что окончательные результаты будут оцениваться как NULL для предиката.
Есть ли что-нибудь, что я могу сделать, чтобы эти предупреждения не появлялись для вызовов этой конкретной функции? Я принял правило не иметь предупреждений о анализе кода для любого кода, который я изменяю. Я надеюсь, что мне не придется использовать ISNULL
для параметров только для того, чтобы заставить анализ кода SSDT заткнуться. Можно ли как-то "подсказать"?
Когда я сказал «подскажи», я думал о том, как работает ReSharper. Вы можете не только контролировать, какие предупреждения и с какой серьезностью появляются, вы также можете отключить конкретный экземпляр предупреждения с помощью прагмы или комментария в коде, или вы можете использовать аннотации. Например, я мог бы поместить аннотацию [NotNull]
к параметру, чтобы указать, что он никогда не будет нулевым. Я надеялся, что будет что-то подобное или что-то с таким же эффектом.
@FromDate DATE = NULL, ...
- person Keith   schedule 27.01.2015