マスター (またはその他の永続的なデータベース) で関数を作成してから、モデル データベースでシノニムを作成できます。
USE model; GO CREATE SYNONYM dbo.getDays FOR master.dbo.getDays;
プレ>これにより、任意の new で関数の同義語が作成されます ただし、既存のデータベース (または将来接続または復元されるデータベース) の場合は、そこにシノニムをコピーする必要があります。これにより、コードの 1 つのコピーを保存するだけで、任意のデータベースで 2 つの部分からなる名前でオブジェクトを参照できます。
余談ですが、コードはもっと簡潔にできます:
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;
プレ>