Puoi creare la funzione nel master (o in un altro database permanente), quindi creare un sinonimo nel database del modello:
USE model;
GO
CREATE SYNONYM dbo.getDays FOR master.dbo.getDays;
Questo creerà un sinonimo della funzione in ogni nuovo database, ma per i database esistenti (o i database allegati o ripristinati in futuro) dovrai copiare il sinonimo lì. Ciò consentirà di fare riferimento all'oggetto con un nome in due parti in qualsiasi database, pur dovendo archiviare solo una copia del codice.
Per inciso, il tuo codice potrebbe essere molto più conciso:
RETURN (SELECT DATEPART(DAY, DATEADD(DAY, -1,
DATEADD(MONTH, 1, DATEADD(DAY, 1-DAY(@date), @date)))));
Quindi dall'alto:
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
Ora per creare un sinonimo per questo in ogni database:
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;