webForumDet fria alternativet

Invariabel i "IN()"

Databaser & SQL

8 svar · 281 visningar · startad av Jesper T

Medlem sedan nov. 20017 144 inlägg
Frågan#1

Går inte detta att lösa på något annat sätt än dynamisk sql om s.id är av datatypen int?

...
WHERE s.id IN(@sid)
Medlem sedan dec. 200012 464 inlägg
#2

Ja, skriv en funktion som delar upp sid, lagrar värdena i en tabellvariabel och returnerar tabellvariabeln som functionsresultat.

Medlem sedan nov. 20017 144 inlägg
#3

Ooops, det låter nästan som att det skulle vara mer belastande för databasen än att göra den dynamisk?

Medlem sedan dec. 200012 464 inlägg
#4

Varför det?

Medlem sedan nov. 20017 144 inlägg
#5

Det var bara en fråga. ;)

Medlem sedan dec. 200012 464 inlägg
#6

Som alltid när man funderar på vad som är bäst ur prestandasynpunkt: Testa.

Medlem sedan dec. 19995 874 inlägg
#7

Många gånger när jag har gjort detta har det snabbaste varit att ta emot indatan och ha en funktion som returnerar en tabell av den inskickade datan (som LarsG föreslår). Tabellen joinar du på sedan mot lämpligt fält istället för att använda IN(), det är ofta snabbare.

Om du har många sökvillkor så är en dynamiskt uppbyggd fråga oftast snabbare, istället för att göra massa "case when", eller vad du nu kan tänkas behöva att göra. Men det absolut viktigaste är att du kan utnyttja dina index på ett bra sätt. Om du i slutändan använder dig av dynamiskt uppbyggd sql så skall du använda sp_executesql istället för exec. Det är inte bara säkrare utan även snabbare.

Lycka till!

Medlem sedan dec. 1999707 inlägg
#8

Jag brukar använda mig av en user function som gör om en kommaseparerad varchar till en tabell.

http://www.webforum.nu/showthread.php?s=&threadid=119334

Då skulle du exempelvis göra följande inner join istället för att använda IN().

varchar @myValues varchar(400)
set @myValues = '1,2,3,4,5,6,7,89,10,11,12,13,14,15,16,17,18,19,20'

SELECT
 User.*
FROM
 User
 INNER JOIN
 dbo.parseString(@myValues) userValues
 ON
 userValues.IDs = User.[ID]
Medlem sedan nov. 20017 144 inlägg
#9

Tack åter igen toha (å Brimba å LarsG).
Det där funkade ju som smort. :)

280 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
122 ms — deklarationer (db)
0 ms — hämta statistik (cache)
155 ms — hämta tråd, inlägg och bilagor (db)
122 ms — ändringar (db)