Du kan skapa funktionen i master (eller någon annan permanent databas) och sedan skapa en synonym i modelldatabasen:
USE model;
GO
CREATE SYNONYM dbo.getDays FOR master.dbo.getDays;
Detta kommer att skapa en synonym till funktionen i alla nya databaser, men för befintliga databaser (eller databaser bifogade eller återställda i framtiden) måste du kopiera synonymen dit. Detta gör att du kan referera till objektet med ett tvådelat namn i vilken databas som helst, samtidigt som du bara behöver lagra en kopia av koden.
Dessutom kan din kod vara mycket mer kortfattad:
RETURN (SELECT DATEPART(DAY, DATEADD(DAY, -1,
DATEADD(MONTH, 1, DATEADD(DAY, 1-DAY(@date), @date)))));
Så från toppen:
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
Nu för att skapa en synonym för detta i varje databas:
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;