sortie de caching d'une fonction définie par l'user (server ms sql)

J'ai appris aujourd'hui que les fonctions définies par l'user dans MS SQL Server doivent être déterministes – c'est-à-dire que vous ne pouvez pas INSERT ou UPDATE ou quoi que ce soit qui pourrait changer l'environnement.

Donc, si vous avez une fonction qui prend trois parameters, et fait une tonne de travail de table à combustion lente avec eux, la chose évidente pourrait être de mettre en cache ces résultats quelque part. Avoir la fonction returnner la valeur caching si elle est assez récente, et faire fonctionner la table à combustion lente si c'est absolument nécessaire.

Mais comme je ne peux pas INSERT depuis l'UDF, je ne peux pas mettre en cache mes résultats. Je suis sur le point d'écrire ce cache dans mon application, mais n'y a-t-il vraiment aucun moyen d'accomplir la même chose en utilisant SQL?

METTRE À JOUR

Merci, commentaires!

Je voudrais utiliser le résultat de la fonction comme critère de requête. Donc, les SP ne le feront pas.

Spécifiquement, j'ai une fonction qui count le nombre de "notes" dans un système, basé sur le produit, le statut, la date, etc. Beaucoup de parameters, mais les résultats ne changent pas si souvent. Ou j'ai une fonction qui prend une string et renvoie une table basée sur certains calculs – facile à faire une fois, et ne change jamais.

Vous ne pouvez pas faire d'insertion / mise à jour dans les fonctions comme vous l'avez indiqué, donc je pense qu'une approche différente est en ordre. Pourquoi ne faites-vous pas un SP (procédure stockée) de la logique que vous devez faire (avec tous les parameters dont vous avez besoin de passer), puis cachez-le. Ce SP aurait également un paramètre OUTPUT, qui renverrait votre nombre de 'notes'.

Ensuite, où vous avez besoin d'appeler la fonction, vous créez un SP pour ces requêtes. Maintenant, dans le SP, vous pouvez appeler le SP précédent que vous avez fait, et le faire returnner la valeur dans une variable, que vous pouvez utiliser comme un return sur l'une de vos requêtes ….

Vérifiez cela pour la syntaxe du paramètre OUTPUT (si vous ne le savez pas déjà): http://msdn.microsoft.com/en-us/library/ms378108(v=sql.90).aspx