Można utworzyć funkcję master (lub innej stałej bazy danych), a następnie utworzyć synonim w modelu bazy danych:
USE model;
GO
CREATE SYNONYM dbo.getDays FOR master.dbo.getDays;
Spowoduje to utworzenie synonim do funkcji w jakichkolwiek nowych baz danych , ale w przypadku istniejących baz danych (lub baz danych dołączonych lub przywróconych w przyszłości) musisz skopiować tam synonim. Umożliwi to odwołanie się do obiektu z dwuczęściową nazwą w dowolnej bazie danych, przy jednoczesnym przechowywaniu tylko jednej kopii kodu.
Tak na marginesie, Twój kod może być znacznie bardziej zwięzły:
RETURN (SELECT DATEPART(DAY, DATEADD(DAY, -1,
DATEADD(MONTH, 1, DATEADD(DAY, 1-DAY(@date), @date)))));
więc od góry:
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
teraz, aby utworzyć synonim to w każdej bazy danych:
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;
"getDays" nie jest rozpoznawaną wbudowaną nazwą funkcji. –
Należy utworzyć funkcję w systemie głównym, a następnie utworzyć synonim w istniejących bazach danych (nie tylko w modelu). Utworzenie go w modelu tworzy funkcję tylko w * nowych * bazach danych, które są tworzone po utworzeniu synonimu w modelu. Zawsze powinieneś zawsze ZAWSZE funkcjami referencyjnymi lub synonimami z prefiksem schematu, więc powinno to być 'dbo.getdays', a nie' getDays'. –
Nie rozumiem, jak działa ten "powrót" –