Usando colunas anuláveis em uma cláusula WHERE
-
13-09-2019 - |
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?
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