Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Czy mogę utworzyć funkcję globalną w SQL Server?

Możesz utworzyć funkcję w głównej (lub innej stałej bazie danych), a następnie utworzyć synonim w bazie danych modelu:

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

Spowoduje to utworzenie synonimu funkcji w każdym nowym baz danych, ale w przypadku istniejących baz danych (lub dołączonych lub przywróconych w przyszłości) będziesz musiał skopiować tam synonim. Umożliwi to odwołanie się do obiektu za pomocą dwuczęściowej nazwy w dowolnej bazie danych, przy jednoczesnym zachowaniu tylko jednej kopii kodu.

Poza tym Twój kod może być znacznie bardziej zwięzły:

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

Więc od góry:

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

Teraz utwórz dla tego synonim w każdej bazie danych:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Błąd serwera SQL:ciąg lub dane binarne zostaną obcięte

  2. Skanowanie wstecz indeksu SQL Server:zrozumienie i dostrajanie wydajności

  3. serwer sql jeden wiersz wiele kolumn w jednej kolumnie

  4. Serwer o wysokiej wydajności - czego powinienem używać?

  5. Jak utworzyć procedurę składowaną w SQL Server