Write Better SQL in 5 Minutes-Introduction to Dynamic SQL

When I started getting into Structured Query Language (SQL) around 2014, I remember scarking the internet for examples. Eu veria as pessoas dizerem coisas como: “isto usa SQL dinâmico” ou ” esse script é dinâmico.”Embora eu tenha visto os exemplos, eu realmente não entendi os componentes que o tornaram “dinâmico” porque eu era novo. Como eu ganhei mais experiência no campo, eu não só aprendi os três componentes que compõem SQL dinâmico, mas também como aplicá-lo a vários casos de uso., Esta breve introdução foi projetada para ajudar os iniciantes SQL, ou qualquer outra pessoa, a entender melhor os componentes do SQL dinâmico.

dados para exemplos

estou a utilizar as opções comercialização dados disponíveis sobre o Kaggle, se interessado.o que é SQL dinâmico?

embora a sua aplicação possa ficar complicada, a definição de SQL dinâmico é na verdade simples:

SQL dinâmico é uma afirmação SQL que se constrói em tempo de execução.

Isto permite-lhe criar uma consulta de propósito geral e construir a declaração que precisa de executar na altura através do uso de variáveis., Vou desconstruir este exemplo de super básico de SQL dinâmicas abaixo:

DECLARE @dynamic_sql NVARCHAR(max)select @dynamic_sql = 'select * from orderFlow'EXEC(@dynamic_sql)

O oposto de um SQL dinâmico é SQL estática, que é uma instrução de SQL que não altera em tempo de execução. Por exemplo:

SELECT * FROM orderFlow

Notice the difference? O SQL estático não é executado usando um comando execute nem construído usando variáveis.

Três Passos para escrever SQL dinâmico

Se você quiser escrever SQL dinâmico, lembre-se dos três componentes :

  1. declarar variáveis
    pense em usar as variáveis como blocos de construção para a declaração SQL., In the example, I declared a variable called dynamic_sql and gave it the data-type nvarchar (max). Uso o max para me dar mais espaço para inserir uma declaração SQL.
DECLARE @dynamic_sql NVARCHAR(max)

2. Construir a String sql
O facto de poder introduzir qualquer SQL que deseje na variável dynamic_ SQL faz parte do que torna este exemplo dinâmico SQL em primeiro lugar! Uma vez que eu quero retornar todos os resultados da tabela, orderFlow, eu configuro a variável para uma simples declaração selecionada que pode ser executada sem erro.

select @dynamic_sql = 'select * from orderFlow '

3., Execute a declaração SQL
a declaração que foi construída no passo dois precisa ser executada. O comando EXEC é normalmente usado para executar procedimentos armazenados, mas pode executar qualquer declaração SQL legítima armazenada como uma string, como a armazenada no dynamic_sql variável.

EXEC(@dynamic_sql)

Imagine trabalhar com uma interface de utilizador que tem um campo de texto que permite a um utilizador introduzir uma declaração SQL raw, e depois executa essa Declaração quando um utilizador clica em correr. Usei funcionalidades semelhantes em produtos de Inteligência de negócios!, Agora que você conhece algum SQL dinâmico, é fácil imaginar como ele pode estar trabalhando nos bastidores.

Imaginado Interface de Usuário

Parabéns! Agora conhece os três componentes da dinâmica SQL!, exemplos:

Imagine que você está criando uma interface de usuário que permite que os usuários interajam com os dados, mas em vez de deixá-los escrever SQL puro, você deixá-los construir uma declaração por meio de 2 listas:

Imaginário UI 2

nos bastidores, usar um procedimento armazenado e dinâmico SQL para executar a instrução SQL construído na INTERFACE:

Observe que o procedimento armazenado usa a entrada do usuário para preencher as duas variáveis., Uma vez que as variáveis já são definidas como visto no mock-up da interface do usuário, o procedimento armazenado simplesmente precisa construir a string e executar as declarações. Eu adicionei um espaço para que o Usuário não precisa se lembrar de inserir um ao executar o procedimento., Por exemplo:

Executar o procedimento armazenado no Microsoft SQL Server Management Estúdios

Caso de uso 2:

Imagine que você deseja usar um procedimento armazenado para consulta a orderFlow tabela para um determinado símbolo na bolsa:

CREATE PROCEDURE sp_example2 
@stock_symbol NVARCHAR(6) = NullAS
SELECT * FROM orderFlow where sym = @stock_symbol

Observe que a variável é utilizada na cláusula WHERE em Caso de Uso 2. Dessa forma, eu posso inserir um símbolo de estoque e obter resultados sem ter que usar uma consulta estática vezes sem conta.,

Running stored procedure in Microsoft SQL Server Management Studios

Results of sp_example2

The Downsides with Dynamic

There can be some downsides to using dynamic SQL., Pode ser propenso a injecção de SQL, tornando-se uma potencial preocupação de segurança. A injeção de SQL geralmente ocorre quando você pede entrada a um usuário, e em vez de entrada esperada como um nome de usuário, o usuário entra em uma declaração SQL que será executada na base de dados causando coisas inesperadas a ocorrer. A injeção de SQL pode causar problemas graves e é uma técnica de hacker comum.

desempenho pode ser outra preocupação potencial, uma vez que o plano de execução não pode ser Cache. Uma maneira de contornar isso é usar procedimentos armazenados e o comando sp_executesql (pelo menos no servidor SQL da Microsoft)., As declarações SQL dinâmicas podem tornar-se complicadas rapidamente e podem ser difíceis de depurar, tornando-as intimidantes para novatos.

Pensamentos finais

embora possa parecer complicado ou tedioso no início, o SQL dinâmico é uma técnica poderosa porque lhe permite construir e executar declarações SQL em tempo de execução., SQL dinâmico consiste de três componentes:

  1. Declarar Variáveis
  2. Construir uma Seqüência de caracteres SQL
  3. Executar SQL

pode haver uma certa desvantagem, como fazer o código mais difícil de depurar, mas a flexibilidade que ele proporciona aos usuários pode superar as preocupações especialmente quando aplicadas de forma adequada.se você está interessado em aprender mais sobre SQL ou ciência de dados, por favor confira meus outros tutoriais:

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *