Ajoutant à l'excellente réponse de David Browne :
Je veux référencer la base de données dans laquelle la procédure stockée est stockée, même si elle est exécutée dans une autre base de données.
Vous avez de la chance, car c'est ainsi que les procédures stockées régulières / permanentes non système fonctionnent déjà de cette façon, et vous devez en fait faire tout votre possible pour que les objets fonctionnent dans la base de données actuelle. C'est ainsi que fonctionnent les fonctions, c'est juste qu'avec les procédures stockées, vous avez des options - les marquer comme "procédures stockées système" ou créer des procédures stockées temporaires - que vous n'avez pas avec les fonctions / vues / déclencheurs / etc.
Étant donné que les fonctions intégrées se comportent légèrement différemment du SQL statique dans les procédures stockées temporaires, l'exemple suivant utilise une table non temporaire pour référencer à la fois un UDF et Inline-TVF. Certes, l'exemple suivant ne teste pas réellement les procédures stockées temporaires, mais la raison pour laquelle j'ai utilisé la table non temporaire est parce que comme nous avons une instance de comportement différent, nous devons nous assurer que ce comportement ne se produit pas ici. Dans l'exemple suivant, si l'un ou l'autre type de fonction connaissait la base de données "actuelle", la référence à la table non temporaire provoquerait une erreur.
INSTALLER
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
TESTER
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;
*/