Question

Je suis en train de créer une vue où je veux une colonne à seulement vrai ou faux. Cependant, il semble que peu importe ce que je fais, SQL Server (2008) estime que ma colonne bits peut en quelque sorte nulle.

J'ai une table appelée « produit » avec la colonne « Etat » qui est INT, NULL. Dans une vue, je veux revenir une ligne pour chaque ligne de produit, avec une colonne de BIT définie sur true si la colonne Product.Status est égale à 3, sinon le champ de bits doit être faux.

Exemple SQL

SELECT CAST( CASE ISNULL(Status, 0)  
               WHEN 3 THEN 1  
               ELSE 0  
             END AS bit) AS HasStatus  
FROM dbo.Product  

Si j'enregistre cette requête en vue et regarder les colonnes dans l'Explorateur d'objets, la colonne HasStatus est réglé sur BIT, NULL. Mais il ne devrait jamais être NULL. Est-il un tour de magie SQL je peux utiliser pour forcer cette colonne à NOT NULL.

Notez que, si je retire le CAST() autour de la CASE, la colonne est correctement réglée comme NOT NULL, mais le type de la colonne est réglée sur INT, ce qui est pas ce que je veux. Je veux qu'il soit BIT. : -)

Était-ce utile?

La solution

Vous pouvez obtenir ce que vous voulez en réorganisant votre requête un peu. L'astuce est que le ISNULL doit être à l'extérieur avant que SQL Server comprendra que la valeur résultante ne peut jamais être NULL.

SELECT ISNULL(CAST(
    CASE Status
        WHEN 3 THEN 1  
        ELSE 0  
    END AS bit), 0) AS HasStatus  
FROM dbo.Product  

L'une des raisons, je trouve cela utile est lorsque vous utilisez un ORM et vous ne veulent la valeur résultante mis en correspondance avec un type nullable. Il peut faciliter les choses tout autour si votre application voit la valeur comme jamais peut-être être nulle. Ensuite, vous n'avez pas à écrire du code pour gérer les exceptions null, etc.

Autres conseils

Pour votre information, pour les personnes en cours d'exécution dans ce message, en ajoutant le ISNULL () autour de l'extérieur de la distribution / convertir peut gâcher l'optimiseur sur votre point de vue.

Nous avons eu 2 tables en utilisant la même valeur que d'une clé d'index, mais avec des types de différents niveaux de précision numérique (mauvaise, je sais) et notre avis rejoignait sur eux pour produire le résultat final. Mais notre code middleware était à la recherche d'un type de données spécifique, et la vue avait Converti () autour de la colonne retournée

J'ai remarqué, comme l'OP a fait, que les descripteurs de colonne du résultat de vue définis comme annulable et je pensais que c'est un primaire / clé étrangère sur 2 tables; pourquoi voudrions-nous le résultat défini comme annulable?

J'ai trouvé ce poste, a jeté ISNULL () autour de la colonne et le tour est joué -. NULLABLE plus ne

problème a été la performance de la vue est allé directement dans les toilettes quand une requête filtrée sur cette colonne.

Pour une raison quelconque, un CONVERT explicite () sur la colonne des résultats de la vue n'a pas bousiller l'optimiseur (il allait devoir faire de toute façon à cause des différents precisions), mais en ajoutant une enveloppe ISNULL redondante () a fait, dans une grande manière.

Tout ce que vous pouvez faire dans une instruction Select est le contrôle des données que le moteur de base de données vous envoie en tant que client. L'instruction select n'a aucun effet sur la structure de la table sous-jacente. Pour modifier la structure de la table que vous devez exécuter une instruction alter table.

  1. d'abord, assurez-vous qu'il n'y a actuellement aucune nulls dans ce champ de bits dans la table
  2. Ensuite, exécutez l'instruction ddl suivante:  Alter Table dbo.Product Alter column status bit not null

Si, Otoh, tout ce que vous essayez de faire est de contrôler la sortie de la vue, alors ce que vous faites est suffisant. Votre syntaxe garantit que la sortie de la colonne HasStatus dans le resultset vues sera en fait jamais est nulle. Il toujours soit la valeur bit = 1 ou de la valeur de bit = 0. Ne vous inquiétez pas ce que l'explorateur d'objets dit ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top