あなたはマスターで関数(またはいくつかの他のパーマネント・データベース)を作成し、モデルのデータベースにシノニムを作成することができます
USE model;
GO
CREATE SYNONYM dbo.getDays FOR master.dbo.getDays;
これは、任意の新しいデータベース内の関数へのシノニムを作成します。既存のデータベース(または将来追加または復元されるデータベース)では、そこに同義語をコピーする必要があります。これにより、コードのコピーを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;
さておき、あなたのコードははるかに簡潔なことができるので
'getDays'は認識された組み込み関数名ではありません。 –
masterに関数を作成してから、モデルだけでなく既存のデータベースに同義語を作成する必要があります。モデルでシノニムを作成すると、シノニムがモデルで作成された後に作成される* new *データベースにのみ関数が作成されます。常にスキーマ接頭辞を使って関数やシノニムを参照する必要があるので、 'getDays'ではなく' dbo.getDays'でなければなりません。 –
私はそれらの 'return'がどのように働くかを理解していません –