KB981037 - CORREÇÃO: Mensagem de erro "Tentando definir o valor de uma coluna não NULL-able como NULL" quando você executa uma consulta que usa a função ISNULL() para selecionar valores de uma coluna anulável no SQL Server 2008

A Microsoft distribui correções do Microsoft SQL Server 2008 como um ficheiro transferível. Como as correções são cumulativas, cada nova versão contém todos os hotfixes e todas as correções de segurança que foram incluídas com o anterior SQL Server 2008 corrigir lançamento.

Sintomas

Tenha em conta o seguinte cenário:

  • No Microsoft SQL Server 2008, você executa uma consulta que usa a função ISNULL() para selecionar valores que estão em uma coluna anulável.
  • A tabela que contém a coluna anulável é unida a outra tabela na coluna anulável.
  • O plano de consulta criado pelo Otimizador de Consultas utiliza uma associação com hash, um spool ou uma tabela de ordenação abaixo do operador JOIN.

Nesse cenário, você recebe a seguinte mensagem de erro:

Nota

Msg 681, Nível 16, Estado 3, Linha 2

A tentar definir o valor de uma coluna não NULL-able para NULL.

Causa

O Otimizador de Consultas determina que a coluna referenciada na função ISNULL() não pode ser anulada porque o operador Join rejeita valores NULL. Em seguida, no plano de consulta, o Otimizador de Consultas envia a expressão que está na função ISNULL() abaixo do operador JOIN. Além disso, o valor da expressão pode ser NULL. No entanto, o Otimizador de Consultas não deriva novamente a propriedade de nulidade da expressão. Em seguida, no plano de consulta, uma tabela de trabalho é usada para implementar a junção hash, o spool ou a tabela de classificação que inclui a expressão. Além disso, a coluna correspondente na tabela de trabalho é declarada como não anulável. Quando o mecanismo de consulta SQL Server tenta inserir valores NULL na tabela de trabalho, ocorre o erro.

Resolução

A correção para este problema foi lançada pela primeira vez na Atualização Cumulativa 7 para SQL Server 2008 Service Pack 1. Para obter mais informações sobre este pacote de atualização cumulativa, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:

979065 Pacote de atualizações cumulativas 7 para SQL Server 2008 Service Pack 1Nota Como as compilações são cumulativas, cada nova versão de correção contém todos os hotfixes e todas as correções de segurança que foram incluídas com o anterior SQL Server 2008 corrigir lançamento. Recomendamos que você considere aplicar o lançamento de correção mais recente que contém esse hotfix. Para mais informações, clique no número de artigo que se segue para ver o artigo na Base de Dados de Conhecimento Microsoft:

970365 As compilações do SQL Server 2008 lançadas após o lançamento do SQL Server 2008 Service Pack 1
Os hotfixes do Microsoft SQL Server 2008 são criados para service packs SQL Server específicos. Tem de aplicar uma correção do SQL Server 2008 Service Pack 1 a uma instalação do SQL Server 2008 Service Pack 1. Por padrão, qualquer hotfix fornecido em um SQL Server service pack é incluído no próximo SQL Server service pack.

Solução

Para contornar esse problema, use um dos seguintes métodos.

Método 1

Remova a função ISNULL() da consulta.

Observação Como a coluna que está nessa função vem do operador JOIN que rejeita valores NULL, a função ISNULL() é redundante.

Método 2

Reescreve a consulta para que o plano de consulta não utilize uma associação com hash, um spool ou uma tabela de ordenação. Por exemplo, se a consulta incluir uma cláusula ORDER BY, crie um índice agrupado ou de abrangência que forneça ordenação necessária e inclua todas as colunas obrigatórias. Quando utiliza este método, o Otimizador de Consultas não utiliza uma tabela de ordenação.

Estado

A Microsoft confirmou que se trata de um problema nos produtos Microsoft listados na secção "Aplica-se a".

Referências

Para obter informações sobre o modelo de manutenção incremental para SQL Server, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:

935897 Um modelo de manutenção incremental está disponível na equipe de SQL Server para fornecer hotfixes para problemas relatados

Para obter mais informações sobre o esquema de nomenclatura para atualizações SQL Server, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:

822499 Novo esquema de nomenclatura para pacotes de atualização de software do Microsoft SQL Server

Para obter mais informações sobre a terminologia de atualização de software, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:

824684 Descrição da terminologia padrão utilizada para descrever as atualizações de software da Microsoft