Adicionando a excelente resposta de David Browne :
Quero referenciar o banco de dados no qual o procedimento armazenado está armazenado, mesmo que seja executado em outro banco de dados.
Você está com sorte, porque é assim que os procedimentos armazenados regulares / permanentes, que não são do sistema, já funcionam dessa maneira e você realmente precisa se esforçar para fazer com que os objetos operem no banco de dados atual. É assim que as funções também funcionam: apenas com procedimentos armazenados, você tem opções - marcando-as como "procedimentos armazenados do sistema" ou criando procedimentos armazenados temporários - que você não possui com funções / visualizações / gatilhos / etc.
Como as funções internas se comportam de maneira ligeiramente diferente do SQL estático nos procedimentos armazenados temporários, o exemplo a seguir usa uma tabela não temporária para fazer referência em UDF e Inline-TVF. É verdade que o exemplo a seguir na verdade não testa procedimentos armazenados temporários, mas o motivo pelo qual usei a tabela não temporária é porque, como temos uma instância de comportamento diferente, precisamos garantir que esse comportamento não ocorra aqui. No exemplo a seguir, se qualquer um dos tipos de função estivesse ciente do banco de dados "atual", a referência à tabela não temporária causaria um erro.
CONFIGURAÇÃO
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
TESTE
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;
*/