Ще трябва да използвате динамичен SQL, ако искате да го правите динамично по този начин. Би означавало всичко, което искате да изпълните в контекста на тази DB, трябва да включите и в динамичния SQL израз.
т.е. приемем, че искате да изброите всички таблици в MainDB:
Това няма да работи, тъй като операторът USE е в различен контекст - след като EXECUTE се изпълни, следният SELECT НЯМА да се изпълнява в същия контекст и така няма да се изпълнява в MainDb (освен ако връзката вече е настроена на MainDb)
DECLARE @DatabaseName NVARCHAR(MAX)
SET @DatabaseName = 'MainDb'
EXECUTE('USE ' + @DatabaseName) -- SQL injection risk!
SELECT name FROM sys.tables
Така че трябва да направите:
DECLARE @DatabaseName NVARCHAR(MAX)
SET @DatabaseName = 'MainDb'
EXECUTE('USE ' + @DatabaseName + ';SELECT name FROM sys.tables') -- SQL injection risk!
Разбира се, трябва да бъдете много внимателни с SQL инжектирането, за което ви насочвам към връзката в отговора на Бари.
За да предотвратите SQL инжектиране, можете също да използвате функция QUOTENAME(), която обвива параметъра в квадратни скоби:
DECLARE @DatabaseName sysname = 'MainDb'
, @SQL NVARCHAR(MAX);
SET @SQL = N'USE ' + QUOTENAME(@DatabaseName);
PRINT(@SQL);
-- USE [MainDb]
EXECUTE(@SQL);