Vous pouvez créer la fonction dans master (ou une autre base de données permanente), puis créer un synonyme dans la base de données model :
USE model;
GO
CREATE SYNONYM dbo.getDays FOR master.dbo.getDays;
Cela créera un synonyme de la fonction dans tout nouveau bases de données, mais pour les bases de données existantes (ou les bases de données attachées ou restaurées à l'avenir), vous devrez y copier le synonyme. Cela vous permettra de référencer l'objet avec un nom en deux parties dans n'importe quelle base de données, tout en n'ayant qu'à stocker une copie du code.
Soit dit en passant, votre code pourrait être beaucoup plus concis :
RETURN (SELECT DATEPART(DAY, DATEADD(DAY, -1,
DATEADD(MONTH, 1, DATEADD(DAY, 1-DAY(@date), @date)))));
Donc du haut :
USE [master];
GO
DROP FUNCTION dbo.getDays;
GO
CREATE FUNCTION dbo.getDays
(
@date DATE
)
RETURNS INT
AS
BEGIN
RETURN (SELECT DATEPART(DAY, DATEADD(DAY, -1,
DATEADD(MONTH, 1, DATEADD(DAY, 1-DAY(@date), @date)))));
END
GO
Maintenant, pour créer un synonyme pour ceci dans chaque base de données :
DECLARE @sql NVARCHAR(MAX) = N'';
SELECT @sql += CHAR(13) + CHAR(10)
+ 'USE ' + QUOTENAME(name) + ';
IF OBJECT_ID(''dbo.getDays'', ''FN'') IS NOT NULL
DROP FUNCTION dbo.getDays;
IF OBJECT_ID(''dbo.getDays'', ''SN'') IS NOT NULL
DROP SYNONYM dbo.getDays
CREATE SYNONYM dbo.getDays FOR master.dbo.getDays;'
FROM sys.databases WHERE name <> 'master';
PRINT @sql;
EXEC sp_executesql @sql;