sql >> Base de Datos >  >> RDS >> Sqlserver

¿Puedo crear una función global en SQL Server?

Puede crear la función en master (o alguna otra base de datos permanente) y luego crear un sinónimo en la base de datos modelo:

USE model;
GO
CREATE SYNONYM dbo.getDays FOR master.dbo.getDays;

Esto creará un sinónimo de la función en cualquier nuevo bases de datos, pero para las 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, y solo tendrá que almacenar una copia del código.

Aparte, su código podría ser mucho más conciso:

  RETURN (SELECT DATEPART(DAY, DATEADD(DAY, -1, 
     DATEADD(MONTH, 1, DATEADD(DAY, 1-DAY(@date), @date)))));

Así que desde arriba:

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 para 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;