Você pode criar a função no master (ou algum outro banco de dados permanente) e, em seguida, criar um sinônimo no banco de dados modelo:
USE model;
GO
CREATE SYNONYM dbo.getDays FOR master.dbo.getDays;
Isso criará um sinônimo para a função em qualquer novo bancos de dados, mas para bancos de dados existentes (ou bancos de dados anexados ou restaurados no futuro), você precisará copiar o sinônimo lá. Isso permitirá que você faça referência ao objeto com um nome de duas partes em qualquer banco de dados, tendo que armazenar apenas uma cópia do código.
Como um aparte, seu código poderia ser muito mais conciso:
RETURN (SELECT DATEPART(DAY, DATEADD(DAY, -1,
DATEADD(MONTH, 1, DATEADD(DAY, 1-DAY(@date), @date)))));
Então, de cima:
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
Agora, para criar um sinônimo para isso em cada banco de dados:
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;