2010-01-12 3 views
14

Il est possible dans SQL Server 2005 de créer une colonne calculée à la fois persistante et définie comme NOT NULL (ne peut pas contenir de valeur null). Le deuxième attribut est important lorsqu'on utilise des bibliothèques comme Linq2Sql si on veut éviter beaucoup de travail manuel pour assurer à notre code que la colonne 'always' a une valeur.Marquage des colonnes calculées persistantes NOT NULL dans SQL Server Management Studio

Avec SQL droite est très simple:
ALTER TABLE Sales ADD Total AS (Price + Taxes) PERSISTED NOT NULL

vu dans la fenêtre de création du studio de gestion SQL Server cette colonne est correctement affiché comme une colonne calculée sans coche pour 'autorise les valeurs NULL. Cependant, je rencontre un problème lors de la création de nouvelles colonnes dans le concepteur pour correspondre à ce modèle: La formule est entrée dans la propriété Spécification de colonne calculée -> (Formule) et la propriété persistée est spécifiée en définissant Persisted sur Yes, mais en essayant de décocher le 'permet nulls' sur une nouvelle colonne calculée dans une boîte de dialogue indiquant "La propriété ne peut pas être modifiée".

Je dois couvrir un large éventail de niveaux de compétence, et pour ce faire, je dois fournir des procédures pour ajouter des colonnes que même un débutant peut suivre (ce qui signifie la fenêtre du concepteur de Management Studio). Existe-t-il un secret dans SQL Server Management Studio pour créer une nouvelle colonne calculée comme NOT NULL dans le concepteur, similaire à comment CTRL + 0 peut être utilisé pour insérer des valeurs NULL dans des cellules?

Répondre

16

Vous pouvez trichez ceci avec ISNULL(Price + Taxes, 0) qui utilise la valeur par défaut 0 pour les calculs NULL.

0

J'ai essayé et en regardant la vue arborescente sur la gauche, il avait en effet fixé la colonne comme non nulle, même si dans le concepteur de volet de droite la case n'a pas été cochée ...

ALTER TABLE Sales ADD Total AS ISNULL(isnull(Price,0) + isnull(Taxes,0),0) PERSISTED NOT NULL 
1

Selon la spécification this article, la valeur de nullability est déterminée par sqlserver en fonction de la valeur possible de l'expression calculée. Puisque Price ou Taxes est probablement nullable, il ne peut pas être sûr que leur somme n'est jamais nulle. Cependant, comme le suggère @Richard, l'utilisation de la méthode ISNULL permet d'éviter cela. Déclarer la colonne NOT NULL ne devrait cependant pas être nécessaire pour autant que j'ai compris.

+0

Je suis dans la même situation, mais ni 'Price' ni' Taxes' ne sont nullables. – xr280xr

10

En tant que notesgraphiques, vous pouvez le faire avec ISNULL.

Je l'utilise souvent pour les indicateurs calculés, par exemple, dans le tableau User, j'ai un DeletedDate pour savoir quand le compte a été supprimé. Je crée ensuite une colonne booléenne non annulable calculée appelé IsDeleted (bit de type) comme ceci:

isnull(case when DeletedDate is null then 0 else 1 end, 0) 

La chose importante à noter est que le ISNULL doit être sur la partie la plus externe de l'expression pour le concepteur de réaliser est une colonne calculée non nulle.

Questions connexes