2010-02-15 11 views
3

SQL Server 2005. J'ai une table avec peu ColumnA, ColumnB intvaleur de la colonne par défaut en fonction de la valeur d'une autre colonne

Puis-je ajouter une valeur par défaut à ColumnB de sorte que ColumnB est 15 si ColumnA est 1 et ColumnB est 0 si ColumnA est 0?

Je sais que je pourrais le faire avec un déclencheur mais mon patron est un préjugé contre les déclencheurs (il a besoin d'un entraînement de sensibilité à la gâchette).

+0

:) "il a besoin de sensibilité de déclenchement formation" mon patron aussi :)) – Ash

Répondre

8

Si votre ColumnB ne peut être que 15 ou zéro, vous pouvez en faire une colonne calculée basée sur ColumnA. Voici le code pour ajouter une nouvelle colonne calculée:

ALTER TABLE YourTable ADD YourComputedColumn AS ColumnA*15 
go 
1

Le seul moyen non déclencheur auquel je peux penser est d'avoir la logique dans une procédure stockée. C'est toujours ma préférence par rapport à un déclencheur, parce que c'est l'endroit le plus susceptible de vérifier. Un déclencheur signifie que vous avez maintenant deux endroits à vérifier lorsque des erreurs/problèmes se produisent. Au-delà, cela dépend de l'utilisation - dans un avenir prévisible, pourrait-il y avoir des enregistrements qui ne devraient pas être affectés par la logique de déclenchement? Sinon, un déclencheur est un moyen plus centralisé de résoudre le problème.

1

Avez-vous considéré un computed column à la place ?. Ce n'est pas exactement la même chose ... mais peut-être cela vous suffit-il?

1

Je pense que cela peut être mieux géré avec une procédure stockée que vous utilisez pour les insertions. En outre, il est difficile de dire la meilleure approche sans une certaine compréhension du type de données que la table contient. Je soupçonne que vous pourriez obtenir un modèle plus clair en divisant ColumnB en une autre table.

1

Les colonnes calculées sont très utiles dans certains scénarios. Il vaut la peine de mentionner qu'ils peuvent (mais pas besoin) être persisté. Le choix de la persistance ou non de la colonne dépend de la façon dont elle est utilisée. Si elle est persistante, elle consomme de l'espace en tant que colonne "régulière", sinon elle est calculée au moment de l'exécution. Vous pouvez également créer des index sur des colonnes calculées.

http://msdn.microsoft.com/en-us/library/ms191250.aspx

0

autre façon:

alter table yourTABLe add ColumnB as case when coalesce(ColumnA,0) = 15 then 0 else 1 end 
go 
Questions connexes