Puede crear la función de maestro (o alguna otra base de datos permanente), y luego crear un sinónimo en la base de datos model:
USE model;
GO
CREATE SYNONYM dbo.getDays FOR master.dbo.getDays;
Esto creará un sinónimo de la función en cualquier nuevos bases de datos , pero para bases de datos existentes (o bases de datos adjuntas o restauradas en el futuro) deberá copiar el sinónimo allí. Esto le permitirá hacer referencia al objeto con un nombre de dos partes en cualquier base de datos, mientras que solo tiene que almacenar una copia del código.
Como acotación al margen, el código podría ser mucho más concisa:
RETURN (SELECT DATEPART(DAY, DATEADD(DAY, -1,
DATEADD(MONTH, 1, DATEADD(DAY, 1-DAY(@date), @date)))));
lo tanto, desde la parte superior:
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
ahora para crear un sinónimo de esto en cada base de datos:
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' no es un nombre de función incorporado reconocido. –
Necesita crear la función en el maestro, luego cree el sinónimo en las bases de datos existentes (no solo en el modelo). Al crearlo en el modelo, solo se crea la función en * nuevas * bases de datos que se crean después de que se haya creado el sinónimo en el modelo. Y siempre, siempre, SIEMPRE debe hacer referencia a funciones o sinónimos con el prefijo de esquema, por lo que debe ser 'dbo.getDays', no' getDays'. –
No entiendo cómo funciona el 'return' –