sql >> Databasteknik >  >> RDS >> Sqlserver

Hur kan jag göra något som:ANVÄND @databaseName

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);


  1. Hur uppdaterar och tar man bort listan Visa data i SQLite-databas med klicklyssnare?

  2. PostgreSQL:Hur ställer jag in sökvägen på användarnivå?

  3. Bygga en mycket tillgänglig databas för Moodle med MySQL-replikering

  4. 4 PL/SQL anonyma blockexempel