Dovresti usare SQL dinamico se vuoi farlo dinamicamente in questo modo. Significherebbe qualsiasi cosa tu voglia eseguire nel contesto di quel DB, dovresti includerla anche nell'istruzione SQL dinamica.
cioè supponiamo che tu voglia elencare tutte le tabelle in MainDB:
Questo non funzionerà, poiché l'istruzione USE si trova in un contesto diverso:una volta eseguito EXECUTE, il seguente SELECT NON verrà eseguito nello stesso contesto e quindi non verrà eseguito in MainDb (a meno che la connessione non fosse già impostata su MainDb)
DECLARE @DatabaseName NVARCHAR(MAX)
SET @DatabaseName = 'MainDb'
EXECUTE('USE ' + @DatabaseName) -- SQL injection risk!
SELECT name FROM sys.tables
Quindi dovresti fare:
DECLARE @DatabaseName NVARCHAR(MAX)
SET @DatabaseName = 'MainDb'
EXECUTE('USE ' + @DatabaseName + ';SELECT name FROM sys.tables') -- SQL injection risk!
Ovviamente, devi stare molto attento con SQL injection, per la quale ti indico il link nella risposta di Barry.
Per prevenire SQL Injection, puoi anche usare la funzione QUOTENAME(), che racchiude il parametro tra parentesi quadre:
DECLARE @DatabaseName sysname = 'MainDb'
, @SQL NVARCHAR(MAX);
SET @SQL = N'USE ' + QUOTENAME(@DatabaseName);
PRINT(@SQL);
-- USE [MainDb]
EXECUTE(@SQL);