När jag började komma in i Structured Query Language (SQL) runt 2014 kommer jag ihåg att skura internet för exempel. Jag skulle se att folk säger saker som ”det här använder dynamisk SQL ”eller” det skriptet är dynamiskt.”Även om jag såg exemplen förstod jag inte riktigt de komponenter som gjorde det ”dynamiskt” eftersom jag var ny. När jag fick mer erfarenhet inom området lärde jag mig inte bara de tre komponenterna som utgör dynamisk SQL, utan också hur man applicerar den på olika användningsfall., Denna korta introduktion är utformad för att hjälpa SQL nybörjare, eller någon annan, bättre förstå komponenterna i dynamisk SQL.
Data för exempel
Jag använder options market trades data tillgängliga på Kaggle om intresserad.
Vad är dynamisk SQL?
även om dess tillämpning kan bli komplicerad är definitionen av dynamisk SQL faktiskt enkel:
dynamisk SQL är en SQL-sats som bygger vid körning.
detta gör att du kan bygga en generell fråga och konstruera det uttalande du behöver för att utföra i farten med hjälp av variabler., Jag kommer att dekonstruera detta exempel på super basic dynamisk SQL nedan:
DECLARE @dynamic_sql NVARCHAR(max)select @dynamic_sql = 'select * from orderFlow'EXEC(@dynamic_sql)
motsatsen till en dynamisk SQL är statisk SQL som är en SQL-sats som inte ändras vid körning. Till exempel:
SELECT * FROM orderFlow
märker skillnaden? Den statiska SQL körs varken med ett körkommando eller byggt med hjälp av variabler.
tre steg för att skriva dynamisk SQL
om du vill skriva dynamisk SQL, kom ihåg de tre komponenterna :
- förklara variabler
Tänk på att använda variablerna som byggstenar för SQL-satsen., I exemplet förklarade jag en variabel som heter dynamic_sql och gav den datatypen nvarchar(max). Jag använder max för att ge mig mest utrymme för att ange en SQL-sats.
DECLARE @dynamic_sql NVARCHAR(max)
2. Konstruera SQL String
det faktum att du kan ange någon SQL du vill ha i variabeln dynamic_sql är en del av det som gör detta exempel dynamisk SQL i första hand! Eftersom jag vill returnera alla resultat från tabellen, orderFlow, ställer jag in variabeln till ett enkelt select-uttalande som kan utföras utan fel.
select @dynamic_sql = 'select * from orderFlow '
3., Utför SQL-sats
satsen som byggdes i steg två måste utföras. EXEC-kommandot används vanligtvis för att köra lagrade procedurer, men kan köra en legit SQL-sats som lagras som en sträng, som den som lagras i variabel dynamic_sql.
EXEC(@dynamic_sql)
Tänk dig att arbeta med ett användargränssnitt som har ett textfält som gör det möjligt för en användare att ange en rå SQL-sats och kör sedan den satsen när en användare klickar på Kör. Jag har använt liknande funktionalitet i Business Intelligence-produkter!, Nu när du vet några dynamiska SQL, är det lätt att föreställa sig hur det kan fungera bakom kulisserna.
grattis! Du vet nu de 3 komponenterna i dynamisk SQL!, exempel:
Tänk dig att du skapar ett användargränssnitt som tillåter användare att interagera med data, men i stället för att låta dem skriva ren SQL, låter du dem bygga ett uttalande med hjälp av 2 listrutor:
bakom kulisserna, använd en lagrad procedur och dynamisk SQL för att utföra SQL-satsen konstruerad i användargränssnittet:
Observera att den lagrade proceduren använder användarinmatningen för att fylla de två variablerna., Eftersom variablerna redan definieras som ses i användargränssnittet mock-up behöver den lagrade proceduren helt enkelt konstruera strängen och utföra uttalandena. Jag lade till ett utrymme så att användaren inte behöver komma ihåg att ange en när du utför proceduren., Till exempel:
använd case 2:
Tänk dig att du vill använda en lagrad procedur för att fråga orderflow-tabellen för en specifik aktiesymbol:
CREATE PROCEDURE sp_example2
@stock_symbol NVARCHAR(6) = NullAS
SELECT * FROM orderFlow where sym = @stock_symbolLägg märke till att variabeln används i where-klausulen i use case 2. På så sätt kan jag ange en aktiesymbol och få resultat utan att behöva använda en statisk fråga om och om igen.,
The Downsides with Dynamic
There can be some downsides to using dynamic SQL., Det kan vara benägna att SQL injektion gör det en potentiell säkerhetsproblem. SQL-injektion sker oftast när du frågar en användare för inmatning, och i stället för förväntad inmatning som ett användarnamn, anger användaren en SQL-sats som kommer att köras på databasen orsakar oväntade saker att inträffa. SQL injektion kan orsaka allvarliga problem och är en vanlig hacker teknik.
prestanda kan vara ett annat potentiellt problem eftersom exekveringsplanen inte kan cachas. Ett sätt att arbeta runt detta är att använda lagrade procedurer och kommandot sp_executesql (åtminstone i Microsoft sql server)., Dynamiska SQL-satser kan bli komplicerade snabbt och kan vara svårt att felsöka vilket gör dem skrämmande för nybörjare.
slutliga tankar
även om det kan verka knepigt eller tråkigt i början, dynamisk SQL är en kraftfull teknik eftersom det tillåter dig att konstruera och köra SQL-satser vid körning., Dynamisk SQL består av tre komponenter:
- förklara variabler
- konstruera SQL String
- Utför SQL
det kan finnas en del nackdelar som gör koden svårare att felsöka, men flexibiliteten det ger användarna kan uppväga oro särskilt när de genomförs på lämpligt sätt.
om du är intresserad av att lära dig mer om SQL eller datavetenskap, kolla in mina andra tutorials: