Anda dapat membuat fungsi di master (atau database permanen lainnya), dan kemudian membuat sinonim dalam database model:
USE model;
GO
CREATE SYNONYM dbo.getDays FOR master.dbo.getDays;
Ini akan membuat sinonim untuk fungsi di baru any apa pun database, tetapi untuk database yang ada (atau database yang dilampirkan atau dipulihkan di masa mendatang), Anda harus menyalin sinonim di sana. Ini akan memungkinkan Anda untuk mereferensikan objek dengan nama dua bagian dalam database apa pun, sementara hanya harus menyimpan satu salinan kode.
Selain itu, kode Anda bisa lebih ringkas:
RETURN (SELECT DATEPART(DAY, DATEADD(DAY, -1,
DATEADD(MONTH, 1, DATEADD(DAY, 1-DAY(@date), @date)))));
Jadi dari atas:
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
Sekarang untuk membuat sinonim untuk ini di setiap 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;