toen ik rond 2014 begon in Structured Query Language (SQL), herinner ik me dat ik het internet zocht naar voorbeelden. Ik zou mensen dingen zien zeggen als: “dit maakt gebruik van dynamische SQL” of ” dat script is dynamisch.”Hoewel ik de voorbeelden zag, begreep ik niet echt de componenten die het “dynamisch” maakten, omdat ik nieuw was. Naarmate ik meer ervaring op deed in het veld, leerde ik niet alleen de drie componenten waaruit dynamic SQL bestaat, maar ook hoe ik het op verschillende use-cases kan toepassen., Deze korte introductie is ontworpen om SQL-beginners, of iemand anders, te helpen de componenten van dynamic SQL beter te begrijpen.
gegevens voor voorbeelden
Ik gebruik de options market trades gegevens die beschikbaar zijn op Kaggle indien geà nteresseerd.
Wat is dynamische SQL?
hoewel de toepassing ervan ingewikkeld kan worden, is de definitie van dynamische SQL eigenlijk eenvoudig:
dynamische SQL is een SQL-statement dat tijdens runtime wordt gebouwd.
Hiermee kunt u een algemene query bouwen en het statement construeren dat u onderweg moet uitvoeren met behulp van variabelen., Ik zal dit voorbeeld van super basic dynamische SQL hieronder deconstrueren:
DECLARE @dynamic_sql NVARCHAR(max)select @dynamic_sql = 'select * from orderFlow'EXEC(@dynamic_sql)
het tegenovergestelde van een dynamische SQL is statische SQL wat een SQL statement is dat niet verandert tijdens runtime. Bijvoorbeeld:
SELECT * FROM orderFlow
merk het verschil op? De statische SQL wordt niet uitgevoerd met een uitvoeren commando of gebouwd met behulp van variabelen.
drie stappen om dynamische SQL te schrijven
Als u dynamische SQL wilt schrijven, onthoud dan de drie componenten:
- Declaratievariabelen
denk aan het gebruik van de variabelen als bouwstenen voor het SQL-statement., In het voorbeeld heb ik een variabele genaamd dynamic_sql gedeclareerd en deze het data-type nvarchar(max) gegeven. Ik gebruik max om me de meeste ruimte te geven om een SQL statement in te voeren.
DECLARE @dynamic_sql NVARCHAR(max)
2. Construct SQL String
het feit dat je elke gewenste SQL kunt invoeren in de variabele dynamic_sql maakt deel uit van wat dit voorbeeld dynamische SQL maakt in de eerste plaats! Omdat ik alle resultaten uit de tabel, orderFlow, wil retourneren, stel ik de variabele in op een eenvoudig SELECT statement dat foutloos kan worden uitgevoerd.
select @dynamic_sql = 'select * from orderFlow '
3., Executeer SQL statement
Het statement dat is gebouwd in Stap twee moet worden uitgevoerd. Het EXEC commando wordt meestal gebruikt om opgeslagen procedures uit te voeren, maar kan elk legit SQL statement draaien dat is opgeslagen als een string, zoals degene die is opgeslagen in variabele dynamic_sql.
EXEC(@dynamic_sql)
stel je voor dat je werkt met een gebruikersinterface met een tekstveld waarmee een gebruiker een raw SQL-statement kan invoeren en dat statement vervolgens uitvoert wanneer een gebruiker op uitvoeren klikt. Ik heb dezelfde functionaliteit gebruikt in Business Intelligence producten!, Nu je een dynamische SQL kent, is het gemakkelijk om je voor te stellen hoe het achter de schermen zou kunnen werken.
Gefeliciteerd! U kent nu de 3 componenten van dynamic SQL!, voorbeelden:
Stel je bij het maken van een user-interface die gebruikers in staat stelt om te communiceren met de gegevens, maar in plaats van ze te laten schrijven puur SQL, je laat ze de bouw van een instructie met 2 lijsten:
Achter de schermen gebruik een opgeslagen procedure en dynamische SQL-voor het uitvoeren van de SQL-instructie opgebouwd in de GEBRUIKERSINTERFACE:
Merk op dat de opgeslagen procedure maakt gebruik van de input van de gebruiker voor het vullen van de twee variabelen., Aangezien de variabelen al gedefinieerd zijn zoals te zien in de user interface mock-up, moet de opgeslagen procedure gewoon de string construeren en de statements uitvoeren. Ik heb een spatie toegevoegd zodat de gebruiker niet hoeft te onthouden om er een in te voeren bij het uitvoeren van de procedure., Bijvoorbeeld:
Use Case 2:
Stel je wilt een opgeslagen procedure gebruiken om de query op de orderFlow tabel voor een specifieke stock symbool:
CREATE PROCEDURE sp_example2
@stock_symbol NVARCHAR(6) = NullAS
SELECT * FROM orderFlow where sym = @stock_symbolMerk op dat de variabele wordt gebruikt in de WHERE-component in het Gebruik van Case 2. Op die manier kan ik een stock symbool invoeren en resultaten krijgen zonder dat ik een statische query steeds opnieuw moet gebruiken.,
The Downsides with Dynamic
There can be some downsides to using dynamic SQL., Het kan gevoelig zijn voor SQL-injectie waardoor het een potentieel veiligheidsrisico is. SQL-injectie vindt meestal plaats wanneer u een gebruiker om input vraagt, en in plaats van verwachte input zoals een gebruikersnaam, voert de gebruiker een SQL-statement in dat op de database draait en onverwachte dingen veroorzaakt. SQL injectie kan ernstige problemen veroorzaken en zijn een veel voorkomende hacker techniek.
de prestaties kunnen een ander potentieel punt van zorg zijn, aangezien het uitvoeringsplan niet in de cache kan worden opgeslagen. Een manier om dit te omzeilen is het gebruik van opgeslagen procedures en het sp_executesql Commando (tenminste in Microsoft SQL server)., Dynamische SQL-verklaringen kunnen snel ingewikkeld worden en kunnen moeilijk te debuggen zijn, waardoor ze intimiderend zijn voor beginners.
Final Thoughts
hoewel het in het begin lastig of vervelend kan lijken, is dynamic sql een krachtige techniek omdat het je in staat stelt SQL-statements tijdens runtime te construeren en uit te voeren., Dynamische SQL bestaat uit drie componenten:
- declareren van variabelen
- Construct SQL String
- uitvoeren SQL
Er kunnen enkele nadelen zijn, zoals het moeilijker maken van de code om te debuggen, maar de flexibiliteit die het gebruikers geeft kan opwegen tegen de zorgen, vooral wanneer het correct wordt geïmplementeerd.
Als u meer wilt weten over SQL of Data Science, bekijk dan mijn andere tutorials: