Olá pessoal, tudo bem!?
No post anterior vimos como criar tabelas temporárias para armazenar dados de consultas temporárias criando mais dinamismo na interação com o banco de dados. Então, aproveitando que estamos falando de consultas e objetos dinâmicos e temporários, quero apresentar o conceito de Dynamic SQL.
CONCEITO
O conceito por detrás desta ferramenta é executar uma consulta como um bloco de texto mas que retorna um resultado esperado, mesmo que não pareça que estamos realizando uma query!
Ao utilizar este recurso no banco de dados, é como se estivéssemos dizendo ao banco: “execute o bloco de texto como se fosse uma consulta”. O banco interpreta o comando, executa e retorna o resultado com uma query normal.
Antes de aprofundarmos mais, veja este exemplo:
Este foi um exemplo bem simples do uso de uma query dinâmica e agora, vamos entender sua estrutura.
- A query dinâmica funciona como uma variável assim precisamos declará-la;
- O data type passado para esta variável tem que ser obrigatoriamente NVARCHAR (unicode);
- MUITO cuidado com o tamanho que será atribuído a variável; Se for menor que o tamanho da query, o comando será truncado e retornará erro!(sofri algumas vezes com isso!!!!) ;
- Quando for atribuir valor a variável na cláusula SET coloque sempre o N antes das aspas simples, isso passa para o banco que o texto é um texto unicode e ele terá que realizar uma eventual conversão implícita;
- E o comando EXEC para executar a variável com a query. É OBRIGATÓRIO que a variável esteja entre parênteses.
Exemplo do erro que ocorre quando executamos a query sem parênteses.
Veja o que ocorre quando passamos o tamanho errado para variável na declaração!
Quando executarem a primeira query, verão que o resultado retornado é de 132 e eu passei para o variável o tamanho de 120. Quando executado o bloco de comando ela reconheceu somente até ‘listpr’, veja envolto em amarelo.
Assim, reforço o cuidado que devemos ter com o tamanho físico da variável em relação ao tamanho da query.
A liberdade no uso das Dynamic SQL é basicamente infinita respeitando os limites da própria linguagem, como este exemplo abaixo:
O que temos é:
- CTE;
- Uma consulta na CTE;
- Como insert em outra tabela física.
Perceba que para a variável utilizei o tamanho max, por não saber qual seria o tamanho do comando inteiro. Alguns podem dizer que aumenta o consumo de recursos e talvez ocorra, mas não chega a ser um grande problema para o seu ambiente, principalmente por ser um tipo de uso pontual.
Ainda sobre o último exemplo, quero chamar atenção para o destaque na query sobre aspas simples duplas. Sempre que for utilizar Dynamic SQL em suas consultas, se atente com valores do tipo texto no bloco. Estes valores exigem aspas duplas.
PROBLEMAS COM SEGURANÇA
Ao entendermos o funcionamento das queries dinâmicas e sua execução com o comando EXEC, é extremamente importante ficar atento quanto a segurança com códigos maliciosos. Não é incomum o uso de SQL Injection quando falamos de query dinâmica.
Um desenvolvedor mal-intencionado ou um código malicioso pode explorar falhas de login no banco e tomar conta dele causando enorme prejuízo. Revise sempre o seu código.
Uma forma de minimizar o risco de se executar um código malicioso nesse caso é executando a query como uma Stored Procedure (veremos este assunto em breve).
EXECUTANDO CONSULTA DINÂMICA COMO UMA STORED PROCEDURE
Como vimos, a chance de acabar executando um código malicioso com um simples EXEC é grande e real, então, o SQL Server possui um ‘mecanismo’ que auxilia na redução deste risco.
Por ser executado como uma procedure o comando só executa aquilo que for passado como valor para a variável, veja este exemplo.
Ao executar esta query, temos este resultado
Percebam que a criação da query em si nada difere do que vimos no início deste post, porém, temos de passar alguns parâmetros para esta procedure para executar a query corretamente.
Veja este final:
Como todo o bloco somente será finalizado ao atribuirmos valores para cada uma das variáveis, a possibilidade de se executar um código malicioso de forma despercebida cai drasticamente, tornando esta forma mais segura.
Este foi um post bem introdutório para apresentar o conceito e o recurso de uma query dinâmica.
Como podemos perceber, sua aplicação é bem vasta e não perde em nada quanto a performance de uma query normal, claro, tenha sempre em mente a questão da segurança e procure sempre utilizar a procedure para executar esse tipo de query.
Em outros posts, pretendo trazer novamente este recurso com mais exemplos e situações em que ele se encaixa perfeitamente! Aqui, deixo o link para baixar o script com alguns exemplos meus!
Espero que tenham gostado, até a próxima!