Scrivi meglio SQL in 5 minuti-Introduzione a Dynamic SQL

Quando ho iniziato a entrare in Structured Query Language (SQL) intorno al 2014, ricordo di aver setacciato Internet per esempi. Vedrei la gente dire cose come “Questo usa SQL dinamico “o” Quello script è dinamico.”Anche se ho visto gli esempi, non ho davvero capito i componenti che lo hanno reso “dinamico” perché ero nuovo. Man mano che ho acquisito maggiore esperienza nel campo, non solo ho imparato i tre componenti che compongono dynamic SQL, ma anche come applicarlo a vari casi d’uso., Questa breve introduzione è progettata per aiutare i principianti di SQL, o chiunque altro, a comprendere meglio i componenti di SQL dinamico.

Dati per esempi

Sto usando i dati di mercato delle opzioni disponibili su Kaggle se interessati.

Che cos’è SQL dinamico?

Anche se la sua applicazione può complicarsi, la definizione di SQL dinamico è in realtà semplice:

SQL dinamico è un’istruzione SQL che costruisce in fase di runtime.

Ciò consente di creare una query di uso generale e costruire l’istruzione che è necessario eseguire al volo attraverso l’uso di variabili., Decostruirò questo esempio di SQL dinamico super basic di seguito:

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

L’opposto di un SQL dinamico è SQL statico che è un’istruzione SQL che non cambia in fase di runtime. Ad esempio:

SELECT * FROM orderFlow

Notare la differenza? L’SQL statico non viene eseguito utilizzando un comando execute né creato utilizzando variabili.

Tre passaggi per scrivere SQL dinamico

Se si desidera scrivere SQL dinamico, ricordare i tre componenti:

  1. Dichiarare variabili
    Pensare di utilizzare le variabili come blocchi di costruzione per l’istruzione SQL., Nell’esempio, ho dichiarato una variabile chiamata dynamic_sql e gli ho dato il tipo di dati nvarchar(max). Io uso max per darmi più spazio per inserire un’istruzione SQL.
DECLARE @dynamic_sql NVARCHAR(max)

2. Construct SQL String
Il fatto che tu possa inserire qualsiasi SQL tu voglia nella variabile dynamic_sql fa parte di ciò che rende questo esempio SQL dinamico in primo luogo! Poiché voglio restituire tutti i risultati dalla tabella, orderFlow, ho impostato la variabile su una semplice istruzione select che può essere eseguita senza errori.

select @dynamic_sql = 'select * from orderFlow '

3., Esegui istruzione SQL
L’istruzione che è stata costruita nel passaggio due deve essere eseguita. Il comando EXEC viene in genere utilizzato per eseguire stored procedure, ma può eseguire qualsiasi istruzione SQL legit memorizzata come una stringa, come quella memorizzata nella variabile dynamic_sql.

EXEC(@dynamic_sql)

Immagina di lavorare con un’interfaccia utente dotata di un campo di testo che consente all’utente di immettere un’istruzione SQL non elaborata e quindi di eseguirla quando un utente fa clic su esegui. Ho usato funzionalità simili nei prodotti di Business Intelligence!, Ora che conosci un SQL dinamico, è facile immaginare come potrebbe funzionare dietro le quinte.

Immaginato Interfaccia Utente

Congratulazioni! Ora conosci i 3 componenti di dynamic SQL!, esempi:

Immaginate di creare una interfaccia utente che consente agli utenti di interagire con i dati, ma invece di lasciarli scrivere SQL puro, li si lascia costruire un economico con 2 menu a tendina:

Immaginario UI 2

Dietro le quinte, utilizzare una stored procedure e dynamic SQL per eseguire l’istruzione SQL costruito nell’interfaccia utente:

si Noti la stored procedure viene utilizzata l’input dell’utente per popolare le due variabili., Poiché le variabili sono già definite come visto nel mock-up dell’interfaccia utente, la stored procedure deve semplicemente costruire la stringa ed eseguire le istruzioni. Ho aggiunto uno spazio in modo che l’utente non debba ricordarsi di inserirne uno durante l’esecuzione della procedura., Per esempio:

Esecuzione di una stored procedure di SQL Server Management Studios

Caso d’uso 2:

Immaginate che si desidera utilizzare una stored procedure per interrogare il orderFlow tabella per un determinato simbolo di borsa:

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

si Noti che la variabile è utilizzata nella clausola WHERE in Caso di Utilizzo 2. In questo modo, posso inserire un simbolo azionario e ottenere risultati senza dover utilizzare una query statica più e più volte.,

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., Può essere soggetto a SQL injection rendendolo un potenziale problema di sicurezza. SQL injection di solito si verifica quando si chiede un utente per l’input, e invece di input previsto come un nome utente, l’utente inserisce un’istruzione SQL che verrà eseguito sul database causando cose impreviste. SQL injection può causare seri problemi e sono una tecnica hacker comune.

Le prestazioni potrebbero essere un altro potenziale problema poiché il piano di esecuzione non può essere memorizzato nella cache. Un modo per aggirare questo problema è utilizzare le stored procedure e il comando sp_executesql (almeno in Microsoft sql Server)., Le istruzioni SQL dinamiche possono diventare complicate velocemente e possono essere difficili da eseguire il debug rendendole intimidatorie per i neofiti.

Considerazioni finali

Anche se all’inizio può sembrare complicato o noioso, dynamic SQL è una tecnica potente perché consente di costruire ed eseguire istruzioni SQL in fase di esecuzione., Dynamic SQL è costituito da tre componenti:

  1. Dichiarare variabili
  2. Costruire stringa SQL
  3. Eseguire SQL

Ci può essere qualche aspetto negativo come rendere il codice più difficile da eseguire il debug, ma la flessibilità che offre agli utenti può superare le preoccupazioni soprattutto quando implementato in modo appropriato.

Se siete interessati a saperne di più su SQL o Scienza dei dati, si prega di controllare i miei altri tutorial:

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *