Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /www/webvol34/an/96qmbdpibm1sspm/danielliljeberg.se/public_html/blog/wp-content/mu-plugins/gkphp.php on line 1
SQL IN() utan dynamisk SQL « Sql « Daniel Liljeberg
Warning: count(): Parameter must be an array or an object that implements Countable in /www/webvol34/an/96qmbdpibm1sspm/danielliljeberg.se/public_html/blog/wp-includes/post-template.php on line 284

Warning: count(): Parameter must be an array or an object that implements Countable in /www/webvol34/an/96qmbdpibm1sspm/danielliljeberg.se/public_html/blog/wp-includes/post-template.php on line 284

SQL IN() utan dynamisk SQL

16 maj, 2011 av Daniel Liljeberg Lämna en kommentar »

Fick en fråga för ett tag sedan hur man kunde lösa ett problem som involverade en sql stored procedure innehållande en ‘IN’ vilkens data man skulle skicka in till proceduren. Detta var löst så som många löser det, med dynamisk SQL. Detta kan liknas vid att du bygger upp din SQL fråga av strängar i din SP och sedan exekverar queryn. Exempelvis

‘ids’ är här en komma sepparerad lista av id’n som vi vill göra vårt uppslag emot. Den dynamiska SQL queryn är inte en del av vår SP utan körs i sitt eget scope. Nackdelen med denna approach är dock att det inte är så lätt för query optimizern att kunna luska ut hur din query bäst skall köras. Utöver detta så måste användare av vår SP nu också ha SELECT rättigheter på alla tabeller som vi i vår dynamiska query hämtar data ifrån. Detta behöver man inte för en SP då rättigheterna sätta på SP’n och det sedan inte spelar någon roll vilka tabeller vår SP hämtar data ifrån. Att dynamiskt generera sin query kan också lämna dörren öppen för SQL injections. Om du hamnar i en situation då du måste använda dynamisk SQL, försök att alltid exekvera dem med ‘sp_executesql’.

Ett sätt att behålla möjligheten att dynamiskt skicka data till din ‘IN’ men slippa dynamisk SQL är att skapa en funktion som splittar upp din komma separerade lista och spara ner värdena i en temporär tabell som du sedan gör ett uppslag emot.

En funktion för att splitta en sträng kan göras på många sätt. Nedan följer en variant som gör det möjligt att välja vilken character man vill splitta på.

Nu kan du använda dig av denna funktion och splitta din sträng innehållande dina id’n.

Dynamisk SQL är dock inte alltid av ondo och kan ibland vara precis rätt väg att gå. Så testa båda lösningarna och se vad som passar bäst för just ditt ändamål. Men håll koll på säkerhets detaljerna.

Flattr this!

Annonser

Kommentera

Du måste vara inloggad för att kunna posta kommentarer..