sql >> Database >  >> RDS >> Sqlserver

Kan ik een globale functie maken in SQL Server?

U kunt de functie in de master (of een andere permanente database) maken en vervolgens een synoniem maken in de modeldatabase:

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

Dit zal een synoniem maken voor de functie in elke nieuwe databases, maar voor bestaande databases (of databases die in de toekomst zijn toegevoegd of hersteld) moet u het synoniem daar kopiëren. Hierdoor kunt u in elke database naar het object verwijzen met een tweedelige naam, terwijl u slechts één kopie van de code hoeft op te slaan.

Even terzijde, je code zou veel beknopter kunnen zijn:

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

Dus van bovenaf:

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

Om hier nu in elke database een synoniem voor te maken:

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;


  1. De server heeft een interne fout of verkeerde configuratie aangetroffen en kon uw verzoek niet voltooien

  2. Hoe herstel in afwachting van status in SQL Server-database te herstellen?

  3. MySQL:datumbereik uitbreiden naar nieuwe rijen

  4. Verbinding maken met mysql met behulp van php