Pular para o conteúdo principal

Dynamic SQL: Técnicas, segurança e otimização

Veja como o SQL dinâmico permite a execução de consultas em tempo de execução com lógica flexível. Explore métodos de execução, dicas de segurança e desempenho e casos de uso práticos.
Atualizado 4 de jun. de 2025  · 9 min lido

Neste guia, explicarei os principais aspectos do SQL dinâmico, incluindo técnicas essenciais para criar e executar consultas dinâmicas, aplicativos, considerações de segurança, estratégias de otimização de desempenho e casos de uso comuns.

O SQL dinâmico é interessante porque é uma técnica avançada que permite a construção e a execução de instruções SQL em tempo de execução. O SQL dinâmico permite que os desenvolvedores escrevam consultas mais flexíveis e adaptáveis que podem responder a diferentes entradas, condições e lógicas durante a execução.

Se você for iniciante em SQL, considere começar com o curso Introdução ao SQL ou com o curso SQL Intermediário para criar uma base sólida. Além disso, acho que o SQL Basics Cheat Sheet, que você pode baixar, é uma referência útil porque contém todas as funções SQL mais comuns.

O que é SQL dinâmico?

SQL dinâmico refere-se a instruções SQL que são construídas e executadas em tempo de execução, em vez de serem codificadas antecipadamente. Esse método oferece uma maneira de criar e executar consultas SQL com base na entrada de variáveis ou na lógica definida durante a execução do programa.

Com o SQL dinâmico, você cria instruções SQL como cadeias de caracteres e as executa usando funções ou construções de execução especiais. Ao contrário do SQL estático, que é predefinido e incorporado diretamente no código, o SQL dinâmico oferece maior flexibilidade, permitindo que as estruturas de consulta, como nomes de tabelas, condições de filtro ou lógica de classificação, sejam determinadas em tempo de execução. Isso o torna uma ferramenta versátil para cenários em que os requisitos de consulta não são conhecidos até que o aplicativo esteja em execução.

Por que usar o SQL dinâmico?

Os aplicativos modernos geralmente exigem consultas a bancos de dados que possam se adaptar às necessidades comerciais em constante mudança e à lógica orientada pelo usuário. O SQL dinâmico é importante para permitir interações mais responsivas e personalizáveis com o banco de dados.

Os casos de uso comuns do SQL dinâmico incluem a geração de relatórios com filtros opcionais, a criação de interfaces de pesquisa com parâmetros personalizáveis, a automatização de tarefas repetitivas do banco de dados e o gerenciamento de objetos como tabelas e índices de forma programática. Ele permite que os desenvolvedores criem aplicativos avançados e adaptáveis, reduzindo a necessidade de lógica codificada. Ao acomodar requisitos variáveis e oferecer suporte ao comportamento orientado pelo usuário, o SQL dinâmico é importante em ambientes em que a flexibilidade, a automação e a tomada de decisões orientada por dados são prioridades.

SQL dinâmico vs. SQL estático

Compreender as diferenças entre SQL estático e dinâmico é importante para que você escolha a abordagem correta. Abaixo estão as principais distinções que você deve conhecer antes de selecionar um dos métodos ao executar suas consultas.

Principais diferenças

As instruções SQL estáticas são codificadas e não são alteradas no tempo de execução. Para um analista de dados, isso significa que as declarações oferecem desempenho previsível e manutenção mais fácil. O SQL dinâmico, por outro lado, é construído e executado em tempo de execução, proporcionando maior flexibilidade ao custo de maior complexidade e possíveis riscos de segurança. Resumi essas diferenças na tabela abaixo.

Recurso

SQL estático

Dynamic SQL

Definição

Instruções SQL predefinidas incorporadas no código.

As instruções SQL são construídas e executadas em tempo de execução.

Flexibilidade

Limitado; as alterações exigem modificações no código e reimplantação.

Altamente flexível; pode se adaptar às mudanças de requisitos e às entradas do usuário em tempo de execução.

Segurança

Mais seguro, menos propenso a injeção de SQL, pois as consultas são codificadas e validadas no momento da compilação.

Risco mais alto; vulnerável à injeção de SQL se a entrada do usuário não for devidamente higienizada.

Desempenho

Mais rápido, pré-compilado e otimizado, resultando em menor sobrecarga.

Mais lento; compilado em tempo de execução, o que pode aumentar a sobrecarga de recursos e reduzir a eficiência.

Capacidade de manutenção

Mais fácil de depurar e manter.

Pode ser mais difícil de ler e solucionar problemas.

Quando você deve escolher o SQL dinâmico

O SQL dinâmico é preferível em cenários em que a estrutura da consulta não pode ser determinada até o tempo de execução ou quando é necessária alta flexibilidade. Isso inclui o seguinte:

  • Relatórios dinâmicos: Quando você precisa selecionar colunas, filtros ou ordens de classificação em tempo de execução.

  • Objetos de banco de dados variáveis: Quando os nomes de tabelas ou colunas são determinados dinamicamente, como em aplicativos multilocatários ou data warehouses com tabelas particionadas por tempo.

  • Pesquisa e filtragem complexas: Quando os recursos de pesquisa avançada exigem a montagem de consultas com base em vários critérios definidos pelo usuário.

  • Execução de declarações DDL e: Para operações como CREATE, DROP, GRANT ou ALTER, que não podem ser executadas com SQL estático em muitas plataformas.

No entanto, as limitações do uso de SQL estático para cenários dinâmicos incluem o seguinte:

  • Incapacidade de lidar com alterações em tempo de execução na estrutura da consulta ou nos objetos do banco de dados.
  • Aumento da duplicação de código quando são necessárias várias consultas semelhantes.
  • A falta de adaptabilidade à lógica orientada pelo usuário reduz a flexibilidade do aplicativo.

SQL dinâmico no SQL Server, PostgreSQL e Oracle

A execução de SQL dinâmico envolve a criação de strings de consulta e o uso de funções apropriadas do banco de dados para executá-las com segurança e eficiência. Nesta seção, descrevo os principais métodos e práticas recomendadas para a execução dinâmica.

Usando o comando EXEC

A maioria das plataformas de banco de dados oferece um comando EXEC ou EXECUTE para executar SQL dinâmico.

Por exemplo, a consulta a seguir executa SQL dinâmico no SQL Server, embora não ofereça suporte à parametrização, aumentando o risco de injeção de SQL.

-- Declare a variable to hold the SQL statement
DECLARE @sql NVARCHAR(MAX)

-- Build dynamic SQL with a WHERE condition for Department = 'Sales'
SET @sql = 'SELECT * FROM Employees WHERE Department = ''Sales'''

-- Execute the dynamic SQL
EXEC(@sql)

Recomendo que você assista aos nossos cursos Introduction to SQL Server e Intermediate SQL Server para saber mais sobre o processamento de dados no SQL Server.

Para o PostgreSQL, o comando EXECUTE deve ser usado em um bloco de código PL/pgSQL, como dentro de uma função ou bloco DO. Por exemplo:

-- Executes a static SQL string using dynamic SQL (PL/pgSQL context)
DO $
BEGIN
  EXECUTE 'SELECT * FROM employees';
END;
$;

No Oracle, o EXECUTE IMMEDIATE não pode retornar diretamente conjuntos de resultados de um comando SELECT, a menos que seja usado com INTO ou cursores.

-- Executes a dynamic SQL statement (usually DML or DDL) at runtime
DECLARE
  v_count NUMBER;
BEGIN
  EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM employees' INTO v_count;
  DBMS_OUTPUT.PUT_LINE(v_count);
END;

Usando sp_executesql e equivalentes

O SQL Server oferece o procedimento armazenado sp_executesql, quepermite que você execute SQL dinâmico com parâmetros, melhorando a segurança e o desempenho:

-- Declare variables to hold SQL command and parameter value
DECLARE @sqlCommand NVARCHAR(1000)
DECLARE @city NVARCHAR(75)

-- Set parameter value
SET @city = 'London'

-- Build parameterized dynamic SQL query
SET @sqlCommand = 'SELECT * FROM Person.Address WHERE City = @city'

-- Execute the query safely using sp_executesql with parameter definition and binding
EXECUTE sp_executesql @sqlCommand, N'@city NVARCHAR(75)', @city = @city

Outros bancos de dados usam uma construção semelhante para reduzir o risco de injeção de SQL e permitir a reutilização do plano de consulta. Por exemplo,

  • Oracle: EXECUTE IMMEDIATE

  • PostgreSQL: EXECUTE dentro do PL/pgSQL

Uso seguro de consultas parametrizadas

A execução parametrizada impede a injeção de SQL ao separar a lógica de consulta da entrada do usuário. Por exemplo, a consulta abaixo usa sp_executesql para permitir a parametrização.

-- Declare a variable to hold the dynamic SQL query and initialize Employee ID
DECLARE @sql NVARCHAR(MAX), @empId INT = 1001;

-- Build parameterized SQL query using a named parameter (@ID)
SET @sql = 'SELECT * FROM Employees WHERE EmployeeID = @ID';

-- Execute the SQL query securely using sp_executesql with parameter declaration and binding
EXEC sp_executesql @sql, N'@ID INT', @ID = @empId;

Como criar uma instrução SQL dinâmica

Agora que você aprendeu os diferentes métodos de execução de consultas SQL dinâmicas, deixe-me orientá-lo em um exemplo de criação e execução do comando SQL dinâmico. As consultas abaixo são executadas no SQL Server.

Etapa 1: Definir as variáveis

Configure variáveis para filtrar dinamicamente as tabelas da tabela Employees com base na coluna Department com um valor de 'Sales'.

-- Prepare dynamic SQL variables to filter the Employees table
DECLARE @tableName NVARCHAR(100) = 'Employees';
DECLARE @filterColumn NVARCHAR(100) = 'Department';
DECLARE @filterValue NVARCHAR(100) = 'Sales';
DECLARE @sql NVARCHAR(MAX);

Etapa 2: Criar a instrução SQL

Crie uma consulta SQL dinâmica parametrizada que selecione todos os registros de uma tabela especificada em que uma determinada coluna corresponda a um valor.

-- Construct a safe dynamic SQL query with table and column names 
-- Use QUOTENAME to prevent injection.
SET @sql = 
  'SELECT * FROM ' + QUOTENAME(@tableName) + 
  ' WHERE ' + QUOTENAME(@filterColumn) + ' = @val';

Etapa 3: Executar com um parâmetro

Agora, execute a consulta SQL dinâmica com um parâmetro @val vinculado com segurança ao valor do filtro 'Sales'.

-- Execute the dynamic query with @val parameter securely passed as 'Sales'.
EXEC sp_executesql @sql, N'@val NVARCHAR(100)', @val = @filterValue;

Recomendo quevocê faça nosso curso Writing Functions and Stored Procedures in SQL Server para entender a estrutura e a ordem das funções SQL para otimizar as consultas.

Considerações sobre segurança e estratégias de atenuação

Embora o SQL dinâmico ofereça flexibilidade, ele também traz um risco maior, especialmente relacionado à injeção de SQL. Vamos discutir as vulnerabilidades comuns e as práticas recomendadas para proteger o uso do SQL dinâmico.

Vulnerabilidades de injeção de SQL

O SQL dinâmico baseado em strings é particularmente vulnerável à injeção de SQL, em que a entrada maliciosa altera a lógica pretendida de uma consulta. Os invasores podem explorar o SQL mal construído para manipular dados, extrair informações confidenciais ou prejudicar a integridade do banco de dados.

Por exemplo, a consulta a seguir é vulnerável à injeção de SQL porque concatena diretamente a entrada do usuário na cadeia de caracteres SQL sem parametrização.

DECLARE @sql NVARCHAR(MAX) = 'SELECT * FROM Users WHERE Username = ''' + @input + '''';
EXEC(@sql);
-- If @input = 'admin' OR '1'='1', this returns all users.

Abordagens de defesa em profundidade

A seguir, você encontrará métodos para garantir que as medidas de segurança estejam em vigor para suas consultas SQL dinâmicas:

  • Parametrização: O uso de consultas parametrizadas é a defesa mais eficaz. Ele garante que a entrada do usuário seja tratada estritamente como dados, não como código executável.

  • Sanitização de objetos: Quando os nomes de tabelas ou colunas precisarem ser dinâmicos, valide-os com base em listas permitidas conhecidas e use funções como QUOTENAME() para evitar injeção.

  • Princípio do menor privilégio: Restrinja as permissões de usuário do banco de dados para que as contas usadas para SQL dinâmico tenham apenas o acesso mínimo necessário. Isso limita os danos possíveis se uma vulnerabilidade for explorada, reduzindo o risco de exposição ou modificação não autorizada dos dados.

  • Validação de entrada: Sempre valide e restrinja as entradas do usuário aos formatos e valores esperados antes de usá-las em instruções SQL. Rejeitar ou higienizar entradas que não estejam em conformidade, reduzindo ainda mais a superfície de ataque.

Técnicas de otimização de desempenho

O SQL dinâmico pode causar sobrecarga de desempenho devido à compilação em tempo de execução e à geração de planos. Para melhorar o desempenho denossas consultas SQL dinâmicas, recomendo as seguintes técnicas de otimização de consultas.

Planejar o armazenamento em cache e a reutilização

Quando o SQL dinâmico é executado, o mecanismo de banco de dados pode armazenar em cache o plano de execução para reutilização, melhorando o desempenho de consultas repetidas. No entanto, a reutilização do plano é mais eficaz quando as consultas são parametrizadas em vez de serem construídas com cadeias de caracteres SQL exclusivas a cada vez.

O uso de construções como sp_executesql com parâmetros permite que o banco de dados reconheça consultas semelhantes e reutilize planos de execução, reduzindo a sobrecarga de compilação e aumentando a eficiência. O SQL Server permite que os guias de plano sejam anexados ao SQL dinâmico, influenciando a otimização e os planos de execução para um melhor desempenho em cenários complexos.

Otimização de lotes

A combinação de várias operações em um único lote de execução pode reduzir o número de viagens de ida e volta entre o aplicativo e o banco de dados, diminuindo a sobrecarga transacional e melhorando a taxa de transferência.

Estratégias de manutenção e depuração

Devido à sua natureza de tempo de execução, a manutenção e a depuração do SQL dinâmico podem ser mais complexas do que o SQL estático. A seguir, apresento estratégias práticas que recomendo para o registro e o tratamento de erros para melhorar a visibilidade, a rastreabilidade e a confiabilidade.

Registro de execução

O registro da execução do SQL dinâmico é importante para a auditoria e a solução de problemas. A captura das instruções SQL exatas que são executadas, especialmente quando são geradas no tempo de execução, ajuda a identificar gargalos de desempenho, lógica inesperada e problemas de segurança. Siga estas práticas para garantir estratégias de registro adequadas:

  • Trilhas de auditoria: A implementação de mecanismos de registro, como tabelas ou gatilhos de auditoria, ajuda a registrar execuções dinâmicas de SQL e alterações de dados. 
  • Solução de problemas: Ao armazenar instruções SQL executadas, parâmetros de entrada, tempos de execução e informações do usuário, as equipes podem identificar mais facilmente a origem dos erros, os gargalos de desempenho ou o acesso não autorizado.
  • Monitoramento de desempenho: Os logs de execução podem ser analisados para detectar consultas de execução lenta, padrões de execução frequentes ou operações com uso intensivo de recursos, dando suporte ao ajuste proativo do desempenho.

Tratamento de erros

A execução dinâmica de SQL deve ser envolvida em uma lógica robusta de tratamento de erros para capturar e reagir com elegância às falhas. Por exemplo, a consulta a seguir registra informações úteis de diagnóstico em uma tabela.

BEGIN TRY
    -- Attempt to execute the parameterized dynamic SQL
    EXEC sp_executesql @sql, @paramDef, @paramVal;
END TRY
BEGIN CATCH
    -- On error, log the message, line, and procedure name with timestamp into ErrorLog table
    INSERT INTO ErrorLog (ErrorMessage, ErrorLine, ErrorProcedure, LoggedAt)
    VALUES (ERROR_MESSAGE(), ERROR_LINE(), ERROR_PROCEDURE(), GETDATE());
END CATCH;

Além disso, considere as seguintes práticas de tratamento de erros:

  • Sempre capture o contexto completo do erro: mensagem, número da linha, procedimento e registro de data e hora.
  • Use o registro em log para correlacionar os erros com o SQL exato que os causou.
  • Em sistemas de produção, considere mecanismos de alerta baseados em erros registrados.

Conclusão

Para utilizar totalmente o SQL dinâmico, os desenvolvedores devem adotar práticas de segurança sólidas. O desempenho também deve ser gerenciado com cuidado por meio da reutilização de planos, da formação de lotes e do registro de execução. Além disso, considere uma abordagem equilibrada que combine a segurança e a velocidade do SQL estático com a adaptabilidade do SQL dinâmico.

Olhando para o futuro, as melhorias nos mecanismos de banco de dados, como planos de execução mais inteligentes e recursos avançados de tempo de execução de SQL, prometem tornar o SQL dinâmico mais eficiente, seguro e fácil de gerenciar em escala. Como próximo passo, você pode seguir nosso programa de carreira Associate Data Analyst in SQL e assinar o podcast DataFrame, que apresenta ótimos episódios, como este que apresentou o co-inventor do SQL: 50 anos de SQL com Don Chamberlin.


Allan Ouko's photo
Author
Allan Ouko
LinkedIn
Eu crio artigos que simplificam a ciência e a análise de dados, tornando-as fáceis de entender e acessíveis.

Perguntas frequentes sobre SQL dinâmico

Como o SQL dinâmico difere do SQL estático?

O SQL estático é fixado no momento da compilação com uma estrutura predeterminada, enquanto o SQL dinâmico cria consultas em tempo real, oferecendo maior flexibilidade, mas exigindo um manuseio cuidadoso.

Quando devo usar o SQL dinâmico?

Use o SQL dinâmico quando a estrutura da consulta depender de condições de tempo de execução, como nomes de tabelas variáveis, filtros orientados pelo usuário ou execução de instruções DDL não suportadas pelo SQL estático.

Quais bancos de dados suportam SQL dinâmico?

A maioria dos principais bancos de dados é compatível com ele, incluindo o SQL Server (EXEC, sp_executesql), PostgreSQL (EXECUTE), Oracle (EXECUTE IMMEDIATE) e MySQL (PREPARE).

Como posso evitar a injeção de SQL em SQL dinâmico?

Use a execução parametrizada como sp_executesql no SQL Server para validar a entrada e evite a concatenação direta de strings com os dados do usuário.

O SQL dinâmico pode afetar o desempenho?

Sim, o SQL dinâmico pode gerar sobrecarga devido à compilação em tempo de execução, mas o uso da parametrização e do cache de planos pode melhorar significativamente o desempenho.

Tópicos

Aprenda SQL com a DataCamp

Curso

Introduction to MongoDB in Python

4 h
21.8K
Learn to manipulate and analyze flexibly structured data with MongoDB.
Ver detalhesRight Arrow
Iniciar curso
Ver maisRight Arrow
Relacionado
SQL Programming Language

blog

O que é SQL? - A linguagem essencial para o gerenciamento de bancos de dados

Saiba tudo sobre o SQL e por que ele é a linguagem de consulta ideal para o gerenciamento de bancos de dados relacionais.
Summer Worsley's photo

Summer Worsley

13 min

blog

Para que o SQL é usado? 7 Principais usos do SQL

Descubra os usos do SQL em setores e trabalhos específicos. Além disso, saiba por que a linguagem SQL é tão versátil e requisitada.
Natassha Selvaraj's photo

Natassha Selvaraj

11 min

Tutorial

Exemplos e tutoriais de consultas SQL

Se você deseja começar a usar o SQL, nós o ajudamos. Neste tutorial de SQL, apresentaremos as consultas SQL, uma ferramenta poderosa que nos permite trabalhar com os dados armazenados em um banco de dados. Você verá como escrever consultas SQL, aprenderá sobre
Sejal Jaiswal's photo

Sejal Jaiswal

15 min

Tutorial

Como usar um alias SQL para simplificar suas consultas

Explore como o uso de um alias SQL simplifica os nomes de colunas e tabelas. Saiba por que usar um alias SQL é fundamental para melhorar a legibilidade e gerenciar uniões complexas.
Allan Ouko's photo

Allan Ouko

9 min

Tutorial

Criando e personalizando tabelas dinâmicas no Power BI

Saiba como criar tabelas dinâmicas personalizáveis no Power BI com formatação condicional avançada e algumas dicas de otimização.
Joleen Bothma's photo

Joleen Bothma

9 min

Tutorial

SELEÇÃO de várias colunas no SQL

Saiba como selecionar facilmente várias colunas de uma tabela de banco de dados em SQL ou selecionar todas as colunas de uma tabela em uma consulta simples.
DataCamp Team's photo

DataCamp Team

3 min

Ver maisVer mais