Se eu quiser usar uma variável na FROM
cláusula de uma consulta SQL, preciso usar SQL dinâmico. O que pode ser uma dor se a consulta for longa e complexa.
Existem algumas maneiras diferentes de executar uma consulta de um banco de dados ao qual você não está conectado no momento. Os dois métodos que eu uso com mais frequência são esses ..
Select * from msdb..sysjobs_view
ou
USE MSDB
Select * from sysjobs_view
Se você iniciar no banco de dados mestre, ambos os itens acima fornecerão os mesmos resultados.
Quando coloco os dois no SQL dinâmico um funciona e o outro não
A partir do mestre, isso funciona
DECLARE @DBN SYSNAME
SET @DBN = 'msdb'
DECLARE @Sql NVARCHAR(MAX)
SET @Sql = N'Select * from ' + @DBN + '..sysjobs_view'
EXEC (@Sql)
Mas isso não
DECLARE @DBN SYSNAME
SET @DBN = 'msdb'
DECLARE @Sql NVARCHAR(MAX)
SET @Sql = N'USE ' + @DBN
EXEC (@Sql)
Select * from sysjobs_view
eu recebo o erro
Msg 156, Level 15, State 1, Line 14 Sintaxe incorreta perto da palavra-chave 'EXEC'.
Minha razão para isso: uma linha de SQL dinâmico em uma consulta grande e complexa será menos dolorosa para codificar do que tentar transformar toda a consulta em SQL dinâmico. Minha pergunta aqui é apenas sobre por que não está funcionando com a USE
cláusula.
Por que não posso usar SQL dinâmico com a USE
cláusula para alterar o contexto do banco de dados?
NOTA: O abaixo funciona e seria fácil de codificar. Mas minha pergunta sobre o porquê permanece.
DECLARE @DBN SYSNAME
SET @DBN = 'msdb'
DECLARE @Sql NVARCHAR(MAX)
SET @Sql = N'USE ' + @DBN +'
Select * from sysjobs_view
'
EXEC (@Sql)
De acordo com o comentário de Tibor Karaszi, a alteração se aplica apenas "ao escopo EXEC" Isso é validado pela declaração da Microsoft abaixo.
A solução mais fácil é provavelmente o exemplo final da pergunta. Adicionar algumas linhas no início e no final do seu código pode alterar o contexto de apenas uma única execução. O resto do seu código permanece em qualquer que seja o contexto antes do 'EXEC'
Existem limitações para usar esta solução SQL dinâmica Se houver aspas simples em seus 2 GB de código, elas devem ser eliminadas dobrando as aspas simples. Isso pode ser uma grande dor se houver muito código para revisar e testar.