Можете да създадете функцията в master (или друга постоянна база данни) и след това да създадете синоним в моделната база данни:
USE model;
GO
CREATE SYNONYM dbo.getDays FOR master.dbo.getDays;
Това ще създаде синоним на функцията във всяко ново бази данни, но за съществуващи бази данни (или бази данни, прикачени или възстановени в бъдеще) ще трябва да копирате синонима там. Това ще ви позволи да посочите обекта с име от две части във всяка база данни, като същевременно трябва да съхранявате само едно копие на кода.
Като настрана, вашият код може да бъде много по-сбит:
RETURN (SELECT DATEPART(DAY, DATEADD(DAY, -1,
DATEADD(MONTH, 1, DATEADD(DAY, 1-DAY(@date), @date)))));
И така отгоре:
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
Сега, за да създадете синоним за това във всяка база данни:
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;