Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Posso criar uma função global no SQL Server?


Você pode criar a função no master (ou algum outro banco de dados permanente) e, em seguida, criar um sinônimo no banco de dados modelo:
USE model;
GO
CREATE SYNONYM dbo.getDays FOR master.dbo.getDays;

Isso criará um sinônimo para a função em qualquer novo bancos de dados, mas para bancos de dados existentes (ou bancos de dados anexados ou restaurados no futuro), você precisará copiar o sinônimo lá. Isso permitirá que você faça referência ao objeto com um nome de duas partes em qualquer banco de dados, tendo que armazenar apenas uma cópia do código.

Como um aparte, seu código poderia ser muito mais conciso:
  RETURN (SELECT DATEPART(DAY, DATEADD(DAY, -1, 
     DATEADD(MONTH, 1, DATEADD(DAY, 1-DAY(@date), @date)))));

Então, de cima:
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

Agora, para criar um sinônimo para isso em cada banco de dados:
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;