Pergunta

Suponha uma definição de tabela no SQL Server da seguinte forma:

CREATE TABLE MyTable (
  Id   UNIQUEIDENTIFIER NULL,
  Info VARCHAR(MAX)
)

E uma consulta:

DECLARE @id UNIQUEIDENTIFIER
DECLARE @info VARCHAR(MAX)
IF @id IS NOT NULL
BEGIN
  SELECT @info = Info
    FROM MyTable
    WHERE Id = @id
END

Nesse caso, o analisador de código estático do Visual Studio produz o seguinte erro:

Aviso :SR0007:Microsoft.Desempenho:Nulável colunas podem fazer com que os resultados finais sejam avaliado como NULL para o predicado.

Não vejo o problema aqui.O erro está relacionado ao desempenho;O MSDN diz que devo usar ISNULL() - mas uma comparação igual a NULL é sempre falsa, certo?Estou faltando alguma coisa ou o aviso está errado?

Foi útil?

Solução

Acho que está se referindo à cláusula WHERE.Está dizendo que tanto o seu parâmetro quanto a sua coluna podem ser NULL; nesse caso, sua cláusula WHERE não é mais avaliada como verdadeiro/falso.Ao canalizar sua coluna anulável para uma que sempre tenha um valor definido (via ISNULL), você estará em melhor forma, em termos lógicos.

Aqui está a documentação da Microsoft sobre esse erro.

Por outro lado, NULLs supostamente tornam as consultas um pouco mais lentas.

Outras dicas

Acho que o analisador pode simplesmente não estar levando em consideração sua declaração IF.

Seu código parece correto para mim.

Acho que é um aviso espúrio - você pode suprimi-lo caso a caso ou completamente esse aviso específico?

O que acontece quando você faz isso?:

CREATE TABLE MyTable (
  Id   UNIQUEIDENTIFIER NOT NULL,
  Info VARCHAR(MAX)
)

A comparação nula depende da configuração.

When SET ANSI_NULLS is ON, all comparisons against a null value evaluate to UNKNOWN

When SET ANSI_NULLS is ON, a SELECT statement that uses WHERE column_name = NULL returns zero rows even if there are null values in column_name. A SELECT statement that uses WHERE column_name <> NULL returns zero rows even if there are no nnull values in column_name.

When SET ANSI_NULLS is OFF, the Equals (=) and Not Equal To (<>) comparison operators do not follow the ISO standard.

Isso é daqui.

IF @id IS NOT NULL

deve ser substituído por

IF ISNull(@id, -1) <> -1

@ Raj:"SE FOR Nulo(@id, -1) <> -1"

Eu não faria isso, pois na verdade substitui a entrada da tabela

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top