Menambahkan ke jawaban David Browne yang luar biasa :
Saya ingin mereferensikan basis data tempat prosedur tersimpan disimpan, bahkan jika dieksekusi di basis data lain.
Anda beruntung karena ini adalah cara yang biasa / permanen, prosedur yang tersimpan non-sistem sudah bekerja dengan cara ini, dan Anda benar-benar harus keluar dari cara Anda untuk mendapatkan objek untuk beroperasi di DB saat ini. Ini adalah bagaimana fungsi bekerja juga, hanya saja dengan prosedur tersimpan, Anda memiliki opsi - menandainya sebagai "prosedur tersimpan sistem" atau membuat prosedur tersimpan sementara - yang tidak Anda miliki dengan fungsi / tampilan / pemicu / dll.
Karena fungsi bawaan berperilaku sedikit berbeda dari SQL statis dalam prosedur tersimpan sementara, contoh berikut menggunakan tabel non-sementara untuk referensi di UDF dan Inline-TVF. Benar, contoh berikut ini tidak benar-benar menguji prosedur tersimpan sementara, tetapi alasan saya menggunakan tabel non-sementara adalah karena karena kita memiliki satu contoh perilaku yang berbeda, kita perlu memastikan bahwa perilaku seperti itu tidak terjadi di sini. Dalam contoh berikut, jika salah satu jenis fungsi menyadari database "saat ini", maka referensi ke tabel non-sementara akan menyebabkan kesalahan.
MENDIRIKAN
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
UJI
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;
*/