Je zou dynamische SQL moeten gebruiken als je het zo dynamisch wilt doen. Zou alles betekenen wat je wilt uitvoeren in de context van die DB, je zou ook in de dynamische SQL-instructie moeten opnemen.
d.w.z. neem aan dat u alle tabellen in MainDB wilt weergeven:
Dit zal niet werken, omdat de USE-instructie zich in een andere context bevindt - zodra EXECUTE is uitgevoerd, zal de volgende SELECT NIET in dezelfde context worden uitgevoerd en dus niet worden uitgevoerd in MainDb (tenzij de verbinding al was ingesteld op MainDb)
DECLARE @DatabaseName NVARCHAR(MAX)
SET @DatabaseName = 'MainDb'
EXECUTE('USE ' + @DatabaseName) -- SQL injection risk!
SELECT name FROM sys.tables
U moet dus het volgende doen:
DECLARE @DatabaseName NVARCHAR(MAX)
SET @DatabaseName = 'MainDb'
EXECUTE('USE ' + @DatabaseName + ';SELECT name FROM sys.tables') -- SQL injection risk!
Natuurlijk moet je heel voorzichtig zijn met SQL-injectie, waarvoor ik je verwijs naar de link in Barry's antwoord.
Om SQL-injectie te voorkomen, kunt u ook de functie QUOTENAME() gebruiken, deze zet parameter tussen vierkante haken:
DECLARE @DatabaseName sysname = 'MainDb'
, @SQL NVARCHAR(MAX);
SET @SQL = N'USE ' + QUOTENAME(@DatabaseName);
PRINT(@SQL);
-- USE [MainDb]
EXECUTE(@SQL);