Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como posso fazer algo como:USE @databaseName


Você teria que usar SQL dinâmico se quiser fazê-lo dinamicamente assim. Significaria qualquer coisa que você deseja executar no contexto desse banco de dados, você também precisaria incluir na instrução SQL dinâmica.

ou seja, suponha que você queira listar todas as tabelas no MainDB:

Isso não funcionará, pois a instrução USE está em um contexto diferente - uma vez executado o EXECUTE, o seguinte SELECT NÃO será executado nesse mesmo contexto e, portanto, não será executado no MainDb (a menos que a conexão já tenha sido definida como MainDb)
DECLARE @DatabaseName NVARCHAR(MAX)
SET @DatabaseName = 'MainDb'
EXECUTE('USE ' + @DatabaseName) -- SQL injection risk!
SELECT name FROM sys.tables

Então você precisaria fazer:
DECLARE @DatabaseName NVARCHAR(MAX)
SET @DatabaseName = 'MainDb'
EXECUTE('USE ' + @DatabaseName + ';SELECT name FROM sys.tables') -- SQL injection risk!

Claro, você precisa ter muito cuidado com a injeção de SQL, para o qual eu indico o link na resposta de Barry.

Para evitar SQL Injection, você também pode usar a função QUOTENAME(), ela envolve o parâmetro entre colchetes:
DECLARE @DatabaseName sysname = 'MainDb'
    , @SQL NVARCHAR(MAX);

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

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

EXECUTE(@SQL);