sql >> Databasteknik >  >> RDS >> Sqlserver

Kan jag skapa en global funktion i SQL Server?

Du kan skapa funktionen i master (eller någon annan permanent databas) och sedan skapa en synonym i modelldatabasen:

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

Detta kommer att skapa en synonym till funktionen i alla nya databaser, men för befintliga databaser (eller databaser bifogade eller återställda i framtiden) måste du kopiera synonymen dit. Detta gör att du kan referera till objektet med ett tvådelat namn i vilken databas som helst, samtidigt som du bara behöver lagra en kopia av koden.

Dessutom kan din kod vara mycket mer kortfattad:

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

Så från 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 för att skapa en synonym för detta i varje databas:

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. Kan du inte ansluta till databasen mysql?

  2. Hur många klustrade index kan det finnas i en tabell?

  3. Hur säkerställer jag integritet mellan orelaterade tabeller?

  4. SELECT fungerar inte när du använder !=i WHERE-satsen (med GROUP BY och HAVING COUNT)