Estou tendo problemas ao tentar alterar dinamicamente o contexto do SSMS para o banco de dados especificado no SQL dinâmico:
EXEC sys.sp_executesql N'USE db1 ' ;
Ele é executado com sucesso, mas o contexto do banco de dados do SSMS não muda.
Eu tentei uma pequena modificação no acima assim
DECLARE @sql NVARCHAR(100) DECLARE @db NVARCHAR(50)
SET @db = N'db1' SET @sql = N'Use ' + @db
EXEC sp_executesql @sql
Novamente, ele é executado com sucesso, mas o banco de dados não muda.
O SSMS NÃO VAI, REpito, NÃO MUDARÁ PARA O CONTEXTO DE UM COMANDO DE USO QUE VOCÊ EXECUTA EM SQL DINÂMICO.
Se o objetivo final é executar algum outro SQL dinâmico dentro do banco de dados escolhido, isso é bastante fácil:
Se precisar passar parâmetros, não tem problema:
Se o objetivo é executar algum SQL estático dentro do banco de dados escolhido, talvez você deva considerar armazenar esse SQL estático em um procedimento armazenado em cada banco de dados e chamá-lo dinamicamente assim:
E espero que o objetivo final não seja executar todo esse código no SSMS apenas para que o SSMS esteja agora no contexto de
@db
... Daniel gostaria muito se eu declarasse explicitamente que isso não é possível, como o comentário de @Lothar também afirmou.O dynamicSQL nãoéexecutado especificamente em linha com o resto do seu códigoéuma entidade separada (mesmo que seja executado como se estivesse em linha
Se você executar o código:
SET @sql = N'Use ' + @db + '; select DB_NAME(); select @@spid'
no lugar do seu conjunto atual, você notará que os resultados que retornam indicam que você moveu o banco de dados ativo, mas ainda está executando na mesma conexão.Se você deseja alterar a seleção do banco de dados in-line, a melhor maneira é fazer algo assim:
Não é bom ou limpo e requer duas linhas por banco de dados em potencial, mas fará o trabalho (não o execute em SQL dinâmico ou você ainda acabará com o mesmo problema do thread principal não ser alterado)
Observe que o uso de comandos USE é proibido em procedimentos/funções
Há um procedimento sp_MSforeachdb não documentado: