Les meilleures Pratiques pour la Colonne Calculée dans SQL Server
Je travaille avec un tableau d'utilisateur et que vous voulez mettre une "fin de probational date de la période". Fondamentalement, chaque nouvel utilisateur a 2 mois à partir de quand ils s'inscrivent dans le cadre de leur période de probation. J'ai vu que je peux mettre une formule dans la colonne de mon tableau, mais je me demandais si je devais avoir un script qui met à jour cette place ou si c'est un délai acceptable d'utiliser des colonnes calculées. - Je accéder à cette table pour diverses choses, et mettra à jour les utilisateurs ligne basé sur la performance importante réalisations. La Date de la Demande ne changera jamais être mis à jour.
Ma question est: Est-ce à l'aide de la colonne calculée une bonne pratique dans cette situation ou que ça va recalculer à chaque fois que je l'ai mise à jour de la ligne (même si je ne vais pas mettre à jour l'Application Date)? Je ne veux pas créer plus de surcharge quand je l'ai mise à jour de la ligne dans l'avenir.
Formule que j'utilise dans la définition de la colonne pour la Date de Fin de la période de Probation:
(dateadd(day,(-1),dateadd(month,(3),dateadd(day,(1)-datepart(day,[APP_DT]),[APP_DT]))))
Sera les 2 mois de la politique changera jamais? Pourrait-il devenir 1 ou 3 (ou autre valeur) dans le futur?
Oui, JoinDate/AppDate même chose (désolé, je les utilise de façon interchangeable). Je ne vais pas passer outre la date, mais à marc_s point, puisqu'il ne va pas être mis à jour, je vais l'inclure dans le cadre de l'insertion de script. J'ai besoin de l'indice de cela aussi, et sans le persisté, ça ne va pas fonctionner si bien. Merci un million de dollars pour la foudre réponse rapide!
Oui, la politique pourrait potentiellement changer, mais si elle le faisait elle s'appliquerait à tous les utilisateurs existants. Très bon point aussi.
OriginalL'auteur Brian | 2013-04-05
Vous devez vous connecter pour publier un commentaire.
De voir que cette date très probablement de ne jamais changer une fois qu'elle est, ce n'est probablement pas un bon candidat pour une colonne calculée.
Après tout: une fois que vous insérez une ligne dans cette table, vous pouvez facilement calculer que "la fin de la période de probation" date à droite et puis (par exemple, dans un déclencheur), et une fois définie, cette date ne pourra jamais le changer.
Ainsi, alors que vous pouvez certainement le faire de cette façon, je serais probablement préfèrent utiliser un
AFTER INSERT
déclencheur (ou une procédure stockée pour laINSERT
opération) qui vient de calcule une fois, et puis les magasins de cette date.Aussi, tout comme un heads-up: une colonne calculée avec la formule est calculée à chaque fois pour y accéder - juste être conscient de cela. C'est, sauf si vous spécifiez le
PERSISTED
mot-clé, dans ce cas, le résultat est stocké le long de côté les autres données de la ligne, et ce serait beaucoup mieux ici, de nouveau, étant donné que la valeur, une fois calculée, n'est pas susceptible de changer à jamais.oui, quelque chose comme ça. Ou si vous avez une date qui pourrait changer au fil du temps, et pour certaines requêtes, vous devez sélectionner ou de groupe, à cette date, du mois et de l'année - alors calculées (et a persisté!) le mois et l'année de cette date, ce serait parfait, car vous pouvez aussi l'index ceux qui ont persisté, des colonnes calculées assez facilement.
Merci beaucoup, cela a été très utile!
J'ai couru dans la situation où j'avais besoin d'utiliser une formule plus grand que le 128 limite caractères valeur par défaut de la formule. Aaron a fait la formule, beaucoup plus courte, donc pas de problème sur cet exemple particulier. Depuis que la question a été sur les meilleures pratiques, j'ai pensé note de la limite. Dans le cas de plus de la formule, le travail autour de sera probablement l'APRÈS déclencheur d'INSERTION.
OriginalL'auteur marc_s
Si vous souhaitez par la suite s'étendre à quelqu'un de la période d'essai sans avoir à changer leur date de la demande, puis une colonne calculée est PAS la voie à suivre. Pourquoi ne pas utiliser un
DEFAULT
contrainte pour les deux colonnes?Résultats:
(Notez que j'ai utilisé un peu moins de convulted approche pour la fin du mois pour deux mois.)
OriginalL'auteur Aaron Bertrand
Il n'y a pas de charge lorsque vous insérez des données; seulement quand vous lisez la colonne les valeurs sont calculées pour cette colonne. Je dirais donc que votre approche est correcte.
OriginalL'auteur Adam Luniewski