sql >> Database teknologi >  >> RDS >> Sqlserver

Hvordan kan jeg gøre noget som:BRUG @databaseName

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


  1. UTL_FILE.FREMOVE Eksempel:Slet en fil i Oracle

  2. 3 måder at "løsne" en streng i MySQL

  3. Brug af LIKE i en Oracle IN-klausul

  4. Primær nøgle i SQL:Alt hvad du behøver at vide om primære nøgleoperationer