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

Kan jeg oprette en global funktion i SQL Server?

Du kan oprette funktionen i master (eller en anden permanent database), og derefter oprette et synonym i modeldatabasen:

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

Dette vil skabe et synonym til funktionen i enhver ny databaser, men for eksisterende databaser (eller databaser vedhæftet eller gendannet i fremtiden) skal du kopiere synonymet dertil. Dette vil tillade dig at referere til objektet med et todelt navn i enhver database, mens du kun skal gemme én kopi af koden.

Som en side kan din kode være meget mere kortfattet:

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

Så fra toppen:

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

Nu for at oprette et synonym for dette i hver 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;


  1. MySQL Recursive få alle børn fra forælder

  2. Sådan springer du række over, når du importerer dårlig MySQL-dump

  3. Hvordan får jeg kolonnenavne i Laravel 4?

  4. Beregning af medianen med en dynamisk markør