sql >> Databáze >  >> RDS >> Sqlserver

Mohu vytvořit globální funkci v SQL Server?

Funkci můžete vytvořit v hlavní (nebo jiné trvalé databázi) a poté vytvořit synonymum v databázi modelu:

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

Tím vytvoříte synonymum funkce v každém novém databáze, ale pro existující databáze (nebo databáze připojené nebo obnovené v budoucnu) tam budete muset synonymum zkopírovat. To vám umožní odkazovat na objekt dvoudílným názvem v jakékoli databázi, přičemž budete muset uložit pouze jednu kopii kódu.

Kromě toho by váš kód mohl být mnohem výstižnější:

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

Takže shora:

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

Nyní vytvořte synonymum pro toto v každé databázi:

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. Nelze připojit kontejner MySQL ke kontejneru Tomcat v dockeru

  2. pomocná funkce fetchAll pomocí PDO

  3. Připojení aplikace VB6 oracle 12 64bit

  4. Projekt Laravel ERR_EMPTY_RESPONSE