Du måste använda dynamisk SQL om du vill göra det dynamiskt så. Skulle betyda allt du vill köra under sammanhanget av den DB:n måste du också inkludera i den dynamiska SQL-satsen.
d.v.s. anta att du vill lista alla tabeller i MainDB:
Detta kommer inte att fungera, eftersom USE-satsen är i ett annat sammanhang - när den EXECUTE har körts kommer följande SELECT INTE att köras i samma sammanhang och kommer därför inte att köras i MainDb (såvida inte anslutningen redan var inställd på MainDb)
DECLARE @DatabaseName NVARCHAR(MAX)
SET @DatabaseName = 'MainDb'
EXECUTE('USE ' + @DatabaseName) -- SQL injection risk!
SELECT name FROM sys.tables
Så du måste göra:
DECLARE @DatabaseName NVARCHAR(MAX)
SET @DatabaseName = 'MainDb'
EXECUTE('USE ' + @DatabaseName + ';SELECT name FROM sys.tables') -- SQL injection risk!
Naturligtvis måste du vara mycket försiktig med SQL-injektion, för vilket jag pekar på länken i Barrys svar.
För att förhindra SQL-injektion kan du också använda QUOTENAME()-funktionen, den lindar parametern inom hakparenteser:
DECLARE @DatabaseName sysname = 'MainDb'
, @SQL NVARCHAR(MAX);
SET @SQL = N'USE ' + QUOTENAME(@DatabaseName);
PRINT(@SQL);
-- USE [MainDb]
EXECUTE(@SQL);