Zu David Brownes hervorragender Antwort hinzufügen :
Ich möchte auf die Datenbank verweisen, in der die gespeicherte Prozedur gespeichert ist, auch wenn sie in einer anderen Datenbank ausgeführt wird.
Sie haben Glück, denn so funktionieren reguläre / permanente, nicht vom System gespeicherte Prozeduren bereits auf diese Weise, und Sie müssen sich wirklich alle Mühe geben, damit Objekte in der aktuellen Datenbank funktionieren. So funktionieren auch Funktionen. Bei gespeicherten Prozeduren haben Sie nur Optionen - sie als "gespeicherte Systemprozeduren" markieren oder temporär gespeicherte Prozeduren erstellen -, die Sie bei Funktionen / Ansichten / Triggern / etc. nicht haben.
Da sich integrierte Funktionen in temporär gespeicherten Prozeduren geringfügig anders verhalten als statisches SQL, wird im folgenden Beispiel eine nicht temporäre Tabelle verwendet, um sowohl in einer UDF als auch in einer Inline-TVF zu referenzieren. Das folgende Beispiel testet zwar keine temporär gespeicherten Prozeduren, aber der Grund, warum ich die nicht temporäre Tabelle verwendet habe, ist, dass wir sicherstellen müssen, dass ein solches Verhalten hier nicht auftritt, da wir eine Instanz mit unterschiedlichem Verhalten haben. Wenn im folgenden Beispiel einer der Funktionstypen die "aktuelle" Datenbank kennt, würde der Verweis auf die nicht temporäre Tabelle einen Fehler verursachen.
INSTALLIEREN
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
PRÜFUNG
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;
*/