Sie können die Funktion in master (oder einer anderen permanenten Datenbank) erstellen und dann ein Synonym in der model-Datenbank erstellen:
USE model;
GO
CREATE SYNONYM dbo.getDays FOR master.dbo.getDays;
Dadurch wird ein Synonym für die Funktion in jedem neuen erstellt Datenbanken, aber für vorhandene Datenbanken (oder Datenbanken, die in der Zukunft angehängt oder wiederhergestellt werden) müssen Sie das Synonym dorthin kopieren. Dadurch können Sie das Objekt mit einem zweiteiligen Namen in jeder Datenbank referenzieren, während Sie nur eine Kopie des Codes speichern müssen.
Abgesehen davon könnte Ihr Code viel prägnanter sein:
RETURN (SELECT DATEPART(DAY, DATEADD(DAY, -1,
DATEADD(MONTH, 1, DATEADD(DAY, 1-DAY(@date), @date)))));
Also von oben:
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
Um nun in jeder Datenbank ein Synonym dafür zu erstellen:
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;