Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Kann ich eine globale Funktion in SQL Server erstellen?

Sie können die Funktion in master (oder einer anderen permanenten Datenbank) erstellen und dann ein Synonym in der model-Datenbank erstellen:

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

Dadurch wird ein Synonym für die Funktion in jedem neuen erstellt Datenbanken, aber für vorhandene Datenbanken (oder Datenbanken, die in der Zukunft angehängt oder wiederhergestellt werden) müssen Sie das Synonym dorthin kopieren. Dadurch können Sie das Objekt mit einem zweiteiligen Namen in jeder Datenbank referenzieren, während Sie nur eine Kopie des Codes speichern müssen.

Abgesehen davon könnte Ihr Code viel prägnanter sein:

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

Also von oben:

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

Um nun in jeder Datenbank ein Synonym dafür zu erstellen:

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;