Agregando a la excelente respuesta de David Browne :
Quiero hacer referencia a la base de datos en la que se almacena el procedimiento almacenado, incluso si se ejecuta en otra base de datos.
Estás de suerte porque así es como los procedimientos regulares / permanentes, no almacenados en el sistema, ya funcionan de esta manera, y en realidad debes hacer todo lo posible para que los objetos funcionen en la base de datos actual. Así es como funcionan las funciones también, es solo que con los procedimientos almacenados, tiene opciones, marcándolas como "procedimientos almacenados del sistema" o creando procedimientos almacenados temporales, que no tiene con funciones / vistas / disparadores / etc.
Debido a que las funciones integradas se comportan de manera ligeramente diferente que el SQL estático en los procedimientos almacenados temporales, el siguiente ejemplo usa una tabla no temporal para hacer referencia tanto en UDF como en Inline-TVF. Es cierto que el siguiente ejemplo en realidad no prueba los procedimientos almacenados temporales, pero la razón por la que utilicé la tabla no temporal es porque, dado que tenemos una instancia de comportamiento diferente, debemos asegurarnos de que tal comportamiento no ocurra aquí. En el siguiente ejemplo, si cualquier tipo de función conocía la base de datos "actual", entonces la referencia a la tabla no temporal causaría un error.
PREPARAR
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
PRUEBA
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;
*/