Vous pouvez simplement ajouter une colonne calculée à votre table:
ALTER TABLE dbo.YourTable
ADD regMonth AS MONTH(regDate) PERSISTED
et être fait avec elle. Cela sera calculé, persistant (par exemple, non recalculé à chaque accès, mais seulement lorsque regDate
changements), contient les informations MONTH pour la date, et peut même être indexé pour la vitesse.
Mise à jour: ok, donc maintenant je comprends - votre "identité par mois" est un peu flou et trompeur. Qu'est-ce que vous voulez est de numéroter séquentiellement les entrées pour chaque mois, non?
Une façon de le faire ne le fait pas/ne le stocke pas, mais en utilisant l'approche burnall
avec la fonction ROW_NUMBER().
Sinon, vous devez faire un déclencheur AFTER INSERT
qui calcule la nouvelle valeur sur INSERT
- mais cela devient a) désordonné et b) vous coûtera pas mal de performance quand vous faites beaucoup d'insertions.
Ma recommandation serait d'utiliser la fonction de burnall
et de laisser cette fonction s'exécuter par exemple. une fois par heure environ pour mettre à jour ces champs. N'essayez pas de comprendre cela à la volée, sur INSERT
- votre performance sera terrible.
c'est comment je pourrais calculer la valeur dans un SP pour l'insertion, je crois que le verrouillage de table est nécessaire pour cela? cela peut-il arriver s'il y a 2 appels à ce sp en même temps, puis-je obtenir 2 enregistrements avec la même valeur pour regDateNumber – Omu
Je ne pense pas que cela fonctionnera correctement dans un environnement de serveur occupé - vous finirez par avec des valeurs en double pour votre "month_identity" puisque vous ne regardez pas du tout la concurrence ici ..... –