How can I do something like: USE @databaseName

You’d have to use dynamic SQL if you want to do it dynamically like that. Would mean anything you want to execute under the context of that DB, you’d need to include in the dynamic SQL statement too.

i.e. assume you want to list all the tables in MainDB:

This won’t work, as the USE statement is in a different context – once that EXECUTE has run, the following SELECT will NOT be running in that same context and so won’t be running in MainDb (unless the connection was already set to MainDb)

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

So you’d need to do:

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

Of course, you need to be very careful with SQL injection, for which I point you to the link in Barry’s answer.

To prevent SQL Injection, you could also use QUOTENAME() function, it wraps parameter in square brackets:

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

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

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

EXECUTE(@SQL);

Leave a Comment