Добавление к отличному ответу Дэвида Брауна :
Я хочу сослаться на базу данных, в которой хранится хранимая процедура, даже если она выполняется в другой базе данных.
Вам повезло, потому что именно так обычные / постоянные несистемные хранимые процедуры уже работают таким образом, и вам действительно нужно приложить все усилия, чтобы заставить объекты работать в текущей БД. Так работают функции, просто у хранимых процедур у вас есть опции - помечать их как «системные хранимые процедуры» или создавать временные хранимые процедуры - чего у вас нет с функциями / представлениями / триггерами / и т. Д.
Поскольку встроенные функции ведут себя несколько иначе, чем статический SQL во временных хранимых процедурах, в следующем примере используется временная таблица для ссылки как в UDF, так и в Inline-TVF. Правда, следующий пример на самом деле не тестирует временные хранимые процедуры, но причина, по которой я использовал невременную таблицу, заключается в том, что, поскольку у нас есть один экземпляр отличающегося поведения, мы должны убедиться, что такого поведения здесь не происходит. В следующем примере, если какой-либо тип функции знал о «текущей» базе данных, то ссылка на временную таблицу вызвала бы ошибку.
НАСТРОИТЬ
USE [tempdb];
CREATE IF NOT EXISTS TABLE dbo.InTempDB (Col1 INT);
INSERT INTO dbo.InTempDB ([Col1]) VALUES (999);
GO
CREATE
OR ALTER -- comment out if using SQL Server < 2017
FUNCTION dbo.GetDbNameUDF()
RETURNS SYSNAME
AS
BEGIN
DECLARE @DoNothing INT;
SELECT @DoNothing = [Col1] FROM dbo.InTempDB;
RETURN DB_NAME();
END;
GO
CREATE
OR ALTER -- comment out if using SQL Server < 2017
FUNCTION dbo.GetDbNameITVF()
RETURNS TABLE
AS
RETURN
SELECT DB_NAME() AS [DbName],
tmp.[Col1]
FROM dbo.InTempDB tmp;
GO
ТЕСТОВОЕ ЗАДАНИЕ
USE [model];
SELECT DB_NAME() AS [CurrentDB],
tempdb.dbo.GetDbNameUDF() AS [DbNameFromUDF];
-- CurrentDB DbNameFromUDF
-- model tempdb
SELECT DB_NAME() AS [CurrentDB],
*
FROM tempdb.dbo.GetDbNameITVF();
-- CurrentDB DbName Col1
-- model tempdb 999
/* -- clean-up
DROP TABLE dbo.InTempDB;
DROP FUNCTION dbo.GetDbNameUDF;
DROP FUNCTION dbo.GetDbNameITVF;
*/