Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment puis-je faire quelque chose comme :USE @databaseName

Vous devrez utiliser SQL dynamique si vous voulez le faire dynamiquement comme ça. Signifierait tout ce que vous voulez exécuter dans le contexte de cette base de données, vous devez également l'inclure dans l'instruction SQL dynamique.

c'est-à-dire supposons que vous vouliez lister toutes les tables dans MainDB :

Cela ne fonctionnera pas, car l'instruction USE est dans un contexte différent - une fois que EXECUTE a été exécuté, le SELECT suivant ne s'exécutera PAS dans le même contexte et ne s'exécutera donc pas dans MainDb (à moins que la connexion n'ait déjà été définie sur MainDb)

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

Donc, vous devez faire :

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

Bien sûr, vous devez être très prudent avec l'injection SQL, pour laquelle je vous indique le lien dans la réponse de Barry.

Pour empêcher l'injection SQL, vous pouvez également utiliser la fonction QUOTENAME(), elle place le paramètre entre crochets :

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

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

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

EXECUTE(@SQL);