Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie kann ich so etwas tun:USE @databaseName

Sie müssten dynamisches SQL verwenden, wenn Sie dies dynamisch so tun möchten. Würde bedeuten, dass Sie alles, was Sie im Kontext dieser DB ausführen möchten, auch in die dynamische SQL-Anweisung aufnehmen müssten.

d.h. angenommen, Sie möchten alle Tabellen in MainDB auflisten:

Dies wird nicht funktionieren, da sich die USE-Anweisung in einem anderen Kontext befindet - sobald EXECUTE ausgeführt wurde, wird das folgende SELECT NICHT in demselben Kontext ausgeführt und daher nicht in MainDb ausgeführt (es sei denn, die Verbindung wurde bereits auf gesetzt MainDb)

DECLARE @DatabaseName NVARCHAR(MAX)
SET @DatabaseName = 'MainDb'
EXECUTE('USE ' + @DatabaseName) -- SQL injection risk!
SELECT name FROM sys.tables

Sie müssten also Folgendes tun:

DECLARE @DatabaseName NVARCHAR(MAX)
SET @DatabaseName = 'MainDb'
EXECUTE('USE ' + @DatabaseName + ';SELECT name FROM sys.tables') -- SQL injection risk!

Natürlich müssen Sie mit der SQL-Einschleusung sehr vorsichtig sein, wofür ich Sie auf den Link in Barrys Antwort verweise.

Um eine SQL-Injection zu verhindern, können Sie auch die Funktion QUOTENAME() verwenden, die Parameter in eckige Klammern einschließt:

DECLARE @DatabaseName sysname = 'MainDb'
    , @SQL NVARCHAR(MAX);

SET @SQL = N'USE ' + QUOTENAME(@DatabaseName);

PRINT(@SQL);
-- USE [MainDb]

EXECUTE(@SQL);