Вопрос по sql, sql-server-2008 – Могу ли я создать создать глобальную функцию в SQL Server?
Можно ли создать функцию в SQL Server, которую я мог бы использовать в любой базе данных на сервере, без добавления префикса базы данных?
Например, с помощью этой функции:
CREATE FUNCTION getDays (@date date)
RETURNS INT
AS
BEGIN
RETURN CASE WHEN MONTH(@date) IN (1, 3, 5, 7, 8, 10, 12) THEN 31
WHEN MONTH(@date) IN (4, 6, 9, 11) THEN 30
ELSE CASE WHEN (YEAR(@date) % 4 = 0 AND
YEAR(@date) % 100 != 0) OR
(YEAR(@date) % 400 = 0)
THEN 29
ELSE 28
END
END
END
а затем создать синоним в базе данных модели:
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;
dbo.getDays
, неgetDays
.
Aaron Bertrand
return
работае
Артём Царионов
@date
ата @) от@date
чтобы получить первое число этого месяца. Добавьте месяц, это первое число следующего месяца. Затем вычтите день. Это последний день месяца @ date. DATEPART (DAY) извлекает день (например, 31 для @date = '2005-05-что угодно') ...
Aaron Bertrand
и, это не работает для функций. Вам необходимо использовать соглашение об именовании из трех частей:
select <dbname>.<schema>.getDays(...)
Почему Microsoft делает функции отличными от хранимых процедур?
sp_configure
вариантallow updates
установлен в 1, или процедура называетсяsp_<something>
.
Aaron Bertrand