CORRECTIF : Message d'erreur « Tentative de définition d'une valeur NULL dans une colonne n'acceptant pas les valeurs NULL. » lorsque vous exécutez une requête qui utilise la fonction ISNULL() pour sélectionner des valeurs d'une colonne nullable dans SQL Server 2008

Microsoft distribue les correctifs de Microsoft SQL Server 2008 en tant que fichier téléchargeable. Les correctifs étant cumulatifs, chaque nouvelle version contient tous les correctifs et correctifs de sécurité inclus dans la précédente 2008 de SQL Server version du correctif.

Symptômes

Considérez le scénario suivant :
  • Dans Microsoft SQL Server 2008, vous exécutez une requête qui utilise la fonction ISNULL() pour sélectionner des valeurs dans une colonne nullable.
  • La table qui contient la colonne nullable est jointe à une autre table à la colonne nullable.
  • Le plan de requête qui est créé par l’optimiseur de requête utilise une jointure de hachage, une bobine ou une table de tri sous l’opérateur de jointure .
Dans ce cas de figure, le message d’erreur suivant s’affiche :
Msg 681, niveau 16, état 3, ligne 2

Tentative de définition d'une valeur NULL dans une colonne n'acceptant pas les valeurs NULL.

Cause

Optimiseur de requêtes détermine que la colonne référencée dans la fonction ISNULL() est non nullable, car l’opérateur de jointure rejette les valeurs NULL. Puis, dans le plan de requête, optimiseur exécute un push de l’expression qui se trouve dans la fonction ISNULL() sous l’opérateur de jointure . En outre, la valeur de l’expression peut être NULL. Toutefois, l'optimiseur de requêtes ne ré-dérive pas la propriété de possibilité de valeur null de l'expression. Puis, dans le plan de requête, une table de travail est utilisée pour implémenter la jointure par hachage, la bobine ou la table de tri qui inclut l’expression. En outre, la colonne correspondante dans la table de travail est déclarée comme non nullable. Lorsque le moteur de requête SQL Server essaie d’insérer des valeurs NULL dans la table de travail, l’erreur se produit.

Résolution


Le correctif de ce problème a été publié dans à jour Cumulative 7 pour SQL Server 2008 Service Pack 1. Pour plus d’informations sur ce package de mise à jour cumulative, cliquez sur le numéro ci-dessous pour afficher l’article correspondant dans la Base de connaissances Microsoft :
979065 Cumulative update package 7 pour SQL Server 2008 Service Pack 1
Remarque Les versions étant cumulatives, chaque nouvelle version du correctif contient tous les correctifs et correctifs de sécurité inclus dans la précédente version du correctif de SQL Server 2008. Nous vous recommandons l’application la plus récente version du correctif qui comprendra ce correctif. Pour plus d'informations, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :
970365 the SQL Server versions 2008 publiées après SQL Server 2008 Service Pack 1
Les correctifs Microsoft SQL Server 2008 sont créés pour les packs de service spécifiques de SQL Server. Vous devez appliquer un correctif SQL Server 2008 Service Pack 1 dans une installation de SQL Server 2008 Service Pack 1. Par défaut, tout correctif qui est fourni dans un service pack de SQL Server est inclus dans le prochain service pack de SQL Server.

Solution de contournement

Pour contourner ce problème, appliquez l’une des méthodes suivantes.

Méthode 1

Supprimer la fonction ISNULL() de la requête.

Remarque : Étant donné que la colonne qui se trouve dans cette fonction provient de l’opérateur JOIN qui rejette les valeurs NULL, la fonction ISNULL() est redondante.

Méthode 2

Réécrivez la requête afin que le plan de requête n’utilise pas une jointure par hachage, une bobine ou une table de tri. Par exemple, si votre requête contient une clause ORDER BY, créer un index ordonné en clusters ou recouvrement qui fournit le classement requis et qui inclut toutes les colonnes requises. Lorsque vous utilisez cette méthode, l’optimiseur de requêtes n’utilise pas une table de tri.

État

Microsoft a confirmé l'existence de ce problème dans les produits Microsoft répertoriés dans la section « S'applique à ».

Références

Pour plus d’informations sur le modèle de service incrémentiel pour SQL Server, cliquez sur le numéro ci-dessous pour afficher l’article correspondant dans la Base de connaissances Microsoft :

935897 un modèle de service incrémentiel est disponible auprès de l’équipe SQL Server pour proposer des correctifs pour les problèmes signalés



Pour plus d’informations sur le schéma d’appellation des mises à jour de SQL Server, cliquez sur le numéro ci-dessous pour afficher l’article correspondant dans la Base de connaissances Microsoft :

822499 Nouveau schéma d’affectation de noms pour les packages de mise à jour logicielle de Microsoft SQL Server


Pour plus d'informations sur la terminologie de mise à jour logicielle, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :
Description 824684 terminologie standard utilisée pour décrire les mises à jour logicielles de Microsoft
Propriétés

ID d'article : 981037 - Dernière mise à jour : 12 janv. 2017 - Révision : 1

Commentaires