您可以创建在主函数(或其他永久性的数据库),然后创建模型数据库的代名词:
USE model;
GO
CREATE SYNONYM dbo.getDays FOR master.dbo.getDays;
这将在任何新数据库创建一个同义词的功能,但对于现有的数据库(或将来连接或恢复的数据库),您需要在那里复制同义词。这将允许您在任何数据库中使用包含两部分名称的对象来引用该对象,而只需存储一份代码副本。
顺便说一句,你的代码可能会更加简洁:
RETURN (SELECT DATEPART(DAY, DATEADD(DAY, -1,
DATEADD(MONTH, 1, DATEADD(DAY, 1-DAY(@date), @date)))));
从顶部
所以:
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;
:
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
我们在每个数据库中创建一个同义词为这个
“getDays”不是公认的内置函数名称。 –
您需要在master中创建函数,然后在现有数据库(不仅仅是模型)中创建同义词。在模型中创建它只会在模型中创建同义词后创建的* new *数据库中创建函数。并且始终应始终使用模式前缀引用函数或同义词,因此它应该是'dbo.getDays',而不是'getDays'。 –
我没有低估这些“返回”的工作方式 –