Pokud to chcete takto dynamicky, museli byste použít dynamické SQL. Znamenalo by to, že cokoli, co chcete provést v kontextu této DB, musíte také zahrnout do dynamického příkazu SQL.
tj. předpokládejme, že chcete vypsat všechny tabulky v MainDB:
Toto nebude fungovat, protože příkaz USE je v jiném kontextu – jakmile se spustí EXECUTE, následující SELECT NEBUDE spuštěn ve stejném kontextu, a tak nepoběží v MainDb (pokud již připojení nebylo nastaveno na MainDb)
DECLARE @DatabaseName NVARCHAR(MAX)
SET @DatabaseName = 'MainDb'
EXECUTE('USE ' + @DatabaseName) -- SQL injection risk!
SELECT name FROM sys.tables
Takže budete muset udělat:
DECLARE @DatabaseName NVARCHAR(MAX)
SET @DatabaseName = 'MainDb'
EXECUTE('USE ' + @DatabaseName + ';SELECT name FROM sys.tables') -- SQL injection risk!
Samozřejmě musíte být velmi opatrní s injekcí SQL, pro kterou vás odkazuji na odkaz v Barryho odpovědi.
Chcete-li zabránit SQL Injection, můžete také použít funkci QUOTENAME(), která zalomí parametr do hranatých závorek:
DECLARE @DatabaseName sysname = 'MainDb'
, @SQL NVARCHAR(MAX);
SET @SQL = N'USE ' + QUOTENAME(@DatabaseName);
PRINT(@SQL);
-- USE [MainDb]
EXECUTE(@SQL);