Du bliver nødt til at bruge dynamisk SQL, hvis du vil gøre det dynamisk på den måde. Vil det betyde alt, hvad du ønsker at udføre under konteksten af den DB, skal du også inkludere i den dynamiske SQL-sætning.
dvs. antag, at du vil liste alle tabellerne i MainDB:
Dette virker ikke, da USE-sætningen er i en anden kontekst - når først den EXECUTE er kørt, vil følgende SELECT IKKE køre i den samme kontekst og vil derfor ikke køre i MainDb (medmindre forbindelsen allerede var sat til MainDb)
DECLARE @DatabaseName NVARCHAR(MAX)
SET @DatabaseName = 'MainDb'
EXECUTE('USE ' + @DatabaseName) -- SQL injection risk!
SELECT name FROM sys.tables
Så du skal gøre:
DECLARE @DatabaseName NVARCHAR(MAX)
SET @DatabaseName = 'MainDb'
EXECUTE('USE ' + @DatabaseName + ';SELECT name FROM sys.tables') -- SQL injection risk!
Selvfølgelig skal du være meget forsigtig med SQL-injektion, hvortil jeg henviser til linket i Barrys svar.
For at forhindre SQL-injektion kan du også bruge QUOTENAME()-funktionen, den ombryder parameter i firkantede parenteser:
DECLARE @DatabaseName sysname = 'MainDb'
, @SQL NVARCHAR(MAX);
SET @SQL = N'USE ' + QUOTENAME(@DatabaseName);
PRINT(@SQL);
-- USE [MainDb]
EXECUTE(@SQL);