none
Diferença entre "IS NULL" e "= NULL" RRS feed

  • Pergunta

  • Pessoal tenho uma SP que recebe alguns parâmetros, quando eu faço a comparação "campo = @parametro", se o @parâmetro for NULL e o campo for NULL ele não entente a condição como verdadeira, quando faço "campo IS @parâmetro" ele funciona, porém se o parâmetro não for NULL da erro, ficaria algo como "campo IS 2" (assumindo que nesse cado @parametro seja 2).

    Tem como tratar isso?

    quarta-feira, 7 de março de 2012 13:14

Respostas

  • Olá Ricardo,

    Tudo irá depender de como está definida a opção SET_ANSI_NULLS.

    Esta opção irá definir o comportamento que o Sql Server deve ter ao comparar valores nulos, basicamente se ele deve seguir o padrão ISO ou não, esta configuração afeta o uso dos operadores relacionais = (igual) e <> (diferente).

    Quando SET_ANSI_NULLS está definido como ON e você utilizar uma instrução semelhante a essa:

    SELECT CAMPOA FROM TABELA
    WHERE CAMPOB = NULL

    Mesmo que exista valores nulos no CAMPOB, o Sql Server não irá retornar nada pois neste caso na operação de relação entre os valores ele irá tratar como UNKNOWN(desconhecido).

    Agora se você fizer:

    SELECT CAMPOA FROM TABELA 
    WHERE CAMPOB IS NULL

    Ele irá retornar os valores pois "IS NULL" não é afetado pela configuração de SET_ANSI_NULLS.

    Se você definir SET_ANSI_NULLS OFF o comportamento é oposto de SET_ANSI_NULLS ON

    Uma opção para resolver seu problema é a seguinte:

    (campo = @parametro OR @parametro IS NULL)

    Mais informações sobre ANSI_NULLS: http://msdn.microsoft.com/pt-br/library/ms188048.aspx

    Espero ter ajudado.


    David Silva | MCITP| MCTS | MCP | ITILF | Blog: http://tilive.wordpress.com

    • Marcado como Resposta ricardo_david quarta-feira, 7 de março de 2012 20:12
    quarta-feira, 7 de março de 2012 13:39

Todas as Respostas

  • Olá Ricardo,

    Bom, para o SQL podemos dizer que o NULL não é propriamente um valor ou a ausência dele; - O NULL é um valor desconhecido, Portando, a comparação NULL = NULL não poderá ser verdadeira, a única maneira é de verificar esta condição seria com comando "IS NULL".

    O que você poderia fazer na sua proc é:

    IF @variavel is not null begin
        
        -- seu bloco de código
    
    end

    Abraços!

    Se útil, Classifique.


    Dhiego Piroto - MCP | MCTS SQL Server 2008 Developer | Email: dhiegopiroto@gmail.com

    quarta-feira, 7 de março de 2012 13:29
  • Olá Ricardo,

    Tudo irá depender de como está definida a opção SET_ANSI_NULLS.

    Esta opção irá definir o comportamento que o Sql Server deve ter ao comparar valores nulos, basicamente se ele deve seguir o padrão ISO ou não, esta configuração afeta o uso dos operadores relacionais = (igual) e <> (diferente).

    Quando SET_ANSI_NULLS está definido como ON e você utilizar uma instrução semelhante a essa:

    SELECT CAMPOA FROM TABELA
    WHERE CAMPOB = NULL

    Mesmo que exista valores nulos no CAMPOB, o Sql Server não irá retornar nada pois neste caso na operação de relação entre os valores ele irá tratar como UNKNOWN(desconhecido).

    Agora se você fizer:

    SELECT CAMPOA FROM TABELA 
    WHERE CAMPOB IS NULL

    Ele irá retornar os valores pois "IS NULL" não é afetado pela configuração de SET_ANSI_NULLS.

    Se você definir SET_ANSI_NULLS OFF o comportamento é oposto de SET_ANSI_NULLS ON

    Uma opção para resolver seu problema é a seguinte:

    (campo = @parametro OR @parametro IS NULL)

    Mais informações sobre ANSI_NULLS: http://msdn.microsoft.com/pt-br/library/ms188048.aspx

    Espero ter ajudado.


    David Silva | MCITP| MCTS | MCP | ITILF | Blog: http://tilive.wordpress.com

    • Marcado como Resposta ricardo_david quarta-feira, 7 de março de 2012 20:12
    quarta-feira, 7 de março de 2012 13:39