Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Posso creare una funzione globale in SQL Server?

Puoi creare la funzione nel master (o in un altro database permanente), quindi creare un sinonimo nel database del modello:

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

Questo creerà un sinonimo della funzione in ogni nuovo database, ma per i database esistenti (o i database allegati o ripristinati in futuro) dovrai copiare il sinonimo lì. Ciò consentirà di fare riferimento all'oggetto con un nome in due parti in qualsiasi database, pur dovendo archiviare solo una copia del codice.

Per inciso, il tuo codice potrebbe essere molto più conciso:

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

Quindi dall'alto:

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

Ora per creare un sinonimo per questo in ogni database:

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;