Voy a tener que estar en desacuerdo con Aaron (y la respuesta aceptada).
El enfoque de Aaron es la forma en que me gusta tratar con "cosas de DBA", por ejemplo, secuencias de comandos de mantenimiento. Nunca quisiera hacer esto con una función de biblioteca que sería llamada por una base de datos de usuario.
¿Por qué? Se dirigirá a la base de datos equivalente a DLL Hell .
Versiones incompatibles
... Antes de Windows 2000, Windows era vulnerable a esto porque la tabla de clase COM se compartía entre todos los usuarios y procesos. Solo se puede declarar que un objeto COM, en un archivo DLL / EXE, tiene un ID de clase COM global específico en un sistema. Si algún programa necesitaba crear una instancia de esa clase, obtuvo lo que fuera la implementación actual registrada centralmente. Como resultado, la instalación de un programa que instala una nueva versión de un objeto común puede inadvertidamente interrumpir otros programas que se instalaron previamente.
Instale .net 4.5 en un servidor que ejecute una aplicación .net 2.0 y ¿qué sucede? Nada, su aplicación continúa utilizando el marco 2.0. Actualice su función LastIndexOf en un servidor que aloja 3 bases de datos de aplicaciones (como parte de una actualización de una de ellas) y ¿qué sucede? Los tres ahora están usando la última versión.
La alternativa es el enfoque adoptado por SQL # . Esto se instala en un esquema en cada base de datos de usuario, por lo que puede actualizar de forma segura la base de datos para la Aplicación-X sin arriesgar la estabilidad de la Aplicación-Y.
Si está trabajando en un entorno de gestión de cambios estrictamente controlado, no tendrá otra opción, no puede actualizar un componente compartido sin probar a todos los consumidores del componente. Si está trabajando en un lugar un poco más "rápido y suelto", puede correr el riesgo de romper algo involuntariamente con un parche / actualización.