Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Мога ли да създам глобална функция в SQL Server?

Можете да създадете функцията в master (или друга постоянна база данни) и след това да създадете синоним в моделната база данни:

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

Това ще създаде синоним на функцията във всяко ново бази данни, но за съществуващи бази данни (или бази данни, прикачени или възстановени в бъдеще) ще трябва да копирате синонима там. Това ще ви позволи да посочите обекта с име от две части във всяка база данни, като същевременно трябва да съхранявате само едно копие на кода.

Като настрана, вашият код може да бъде много по-сбит:

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

И така отгоре:

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

Сега, за да създадете синоним за това във всяка база данни:

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. T-SQL:Показване на съхранени процедури, свързани с таблици, циклично

  2. ssrs 2008 каскадни параметри

  3. Преобразуване на SQL Server varBinary данни в низ C#

  4. Как да добавя часове към текущата дата в SQL Server?

  5. Как може да се направи сравнение между времената в цикъла while в съхранената процедура?