Sie müssten dynamisches SQL verwenden, wenn Sie dies dynamisch so tun möchten. Würde bedeuten, dass Sie alles, was Sie im Kontext dieser DB ausführen möchten, auch in die dynamische SQL-Anweisung aufnehmen müssten.
d.h. angenommen, Sie möchten alle Tabellen in MainDB auflisten:
Dies wird nicht funktionieren, da sich die USE-Anweisung in einem anderen Kontext befindet - sobald EXECUTE ausgeführt wurde, wird das folgende SELECT NICHT in demselben Kontext ausgeführt und daher nicht in MainDb ausgeführt (es sei denn, die Verbindung wurde bereits auf gesetzt MainDb)
DECLARE @DatabaseName NVARCHAR(MAX)
SET @DatabaseName = 'MainDb'
EXECUTE('USE ' + @DatabaseName) -- SQL injection risk!
SELECT name FROM sys.tables
Sie müssten also Folgendes tun:
DECLARE @DatabaseName NVARCHAR(MAX)
SET @DatabaseName = 'MainDb'
EXECUTE('USE ' + @DatabaseName + ';SELECT name FROM sys.tables') -- SQL injection risk!
Natürlich müssen Sie mit der SQL-Einschleusung sehr vorsichtig sein, wofür ich Sie auf den Link in Barrys Antwort verweise.
Um eine SQL-Injection zu verhindern, können Sie auch die Funktion QUOTENAME() verwenden, die Parameter in eckige Klammern einschließt:
DECLARE @DatabaseName sysname = 'MainDb'
, @SQL NVARCHAR(MAX);
SET @SQL = N'USE ' + QUOTENAME(@DatabaseName);
PRINT(@SQL);
-- USE [MainDb]
EXECUTE(@SQL);