Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Puis-je créer créer une fonction globale dans SQL Server ?

Vous pouvez créer la fonction dans master (ou une autre base de données permanente), puis créer un synonyme dans la base de données model :

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

Cela créera un synonyme de la fonction dans tout nouveau bases de données, mais pour les bases de données existantes (ou les bases de données attachées ou restaurées à l'avenir), vous devrez y copier le synonyme. Cela vous permettra de référencer l'objet avec un nom en deux parties dans n'importe quelle base de données, tout en n'ayant qu'à stocker une copie du code.

Soit dit en passant, votre code pourrait être beaucoup plus concis :

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

Donc du haut :

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

Maintenant, pour créer un synonyme pour ceci dans chaque base de données :

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;