Bạn có thể tạo hàm trong cơ sở dữ liệu chính (hoặc một số cơ sở dữ liệu cố định khác), rồi tạo một từ đồng nghĩa trong cơ sở dữ liệu mô hình:
USE model;
GO
CREATE SYNONYM dbo.getDays FOR master.dbo.getDays;
Điều này sẽ tạo ra một từ đồng nghĩa với hàm trong bất kỳ mới nào cơ sở dữ liệu, nhưng đối với cơ sở dữ liệu hiện có (hoặc cơ sở dữ liệu được đính kèm hoặc khôi phục trong tương lai), bạn sẽ cần sao chép từ đồng nghĩa vào đó. Điều này sẽ cho phép bạn tham chiếu đối tượng với tên gồm hai phần trong bất kỳ cơ sở dữ liệu nào, trong khi chỉ phải lưu trữ một bản sao của mã.
Ngoài ra, mã của bạn có thể ngắn gọn hơn nhiều:
RETURN (SELECT DATEPART(DAY, DATEADD(DAY, -1,
DATEADD(MONTH, 1, DATEADD(DAY, 1-DAY(@date), @date)))));
Vì vậy, từ đầu:
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
Bây giờ để tạo một từ đồng nghĩa cho điều này trong mỗi cơ sở dữ liệu:
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;