Передача столбцов, допускающих значение NULL, в функцию вызывает предупреждение SR0007 — даже несмотря на то, что функция использует COALESCE и ISNULL внутри

У меня был предикат, который повторялся во многих разных предложениях 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] к параметру, чтобы указать, что он никогда не будет нулевым. Я надеялся, что будет что-то подобное или что-то с таким же эффектом.


person John Saunders    schedule 27.01.2015    source источник
comment
Просто предположение - поможет ли вам добавить значения по умолчанию для параметров? @FromDate DATE = NULL, ...   -  person Keith    schedule 27.01.2015
comment
@Keith: с первой попытки я не смог заставить работать значения по умолчанию в функции. Мне по-прежнему требовалось передать все параметры.   -  person John Saunders    schedule 27.01.2015
comment
Параметры по умолчанию в функциях SQL нелогичны ИМХО. Вам все еще нужно указать каждый параметр при вызове функции. Но я надеялся, что этот подход даст анализу кода подсказку, которую вы ищете.   -  person Keith    schedule 27.01.2015


Ответы (1)


Вы можете щелкнуть правой кнопкой мыши предупреждение в списке ошибок и выбрать «Подавить сообщения анализа статического кода». Это предотвратит все случаи ошибки SR0007 в этом конкретном файле. Он по-прежнему будет подниматься в других файлах (похоже, это то, что вам нужно). В качестве альтернативы, если вы никогда не хотите видеть эти предупреждения, отключите правило в свойствах вашего проекта.

Изменить: происходит создание файла StaticCodeAnalysis.SuppressMessages.xml со следующей записью:

<!-- language: lang-xml -->
<?xml version="1.0" encoding="utf-8" ?>
<StaticCodeAnalysis version="2" xmlns="urn:Microsoft.Data.Tools.Schema.StaticCodeAnalysis">
  <SuppressedFile FilePath="DatabaseScalarFunction1.sql">
    <SuppressedRule Category="Microsoft.Rules.Data" RuleId="SR0007" />
  </SuppressedFile>
</StaticCodeAnalysis>

Как видите, это фильтрует отображаемые ошибки/предупреждения сначала по имени файла, а затем по идентификатору правила. Таким образом, любые предупреждения с идентификатором "SR0007" в файле "DatabaseScalarFunction1.sql" будут игнорироваться. Если бы у вас было несколько процедур в этом файле, предупреждение было бы проигнорировано для всех из них.

person Kevin Cunnane    schedule 27.01.2015
comment
Что вы имеете в виду в этом конкретном файле? Вы имеете в виду всю хранимую процедуру? Это будет работать достаточно хорошо, хотя я все равно пропущу какие-либо законные случаи SR0007 в этой хранимой процедуре. - person John Saunders; 27.01.2015
comment
Я добавил объяснение того, что происходит - это означает, что законные случаи также отфильтровываются. Если вы хотите запросить исправление основного поведения, я предлагаю открыть ошибку Connect, чтобы улучшить поведение правила, — перейдите по адресу connect.microsoft.com/SQLServer/feedback/CreateFeedback.aspx и используйте категорию Инструменты разработчика (SSDT, BIDS и т. д.). - person Kevin Cunnane; 27.01.2015
comment
Спасибо, Кевин. Кстати, если вы работаете в Microsoft, вы можете указать это в своем профиле для раскрытия информации. - person John Saunders; 27.01.2015
comment
Спасибо, Джон, я не знал, что мне не хватает этой информации - теперь исправлено. - person Kevin Cunnane; 27.01.2015