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