Invariabel i "IN()"
8 svar · 281 visningar · startad av Jesper T
Ja, skriv en funktion som delar upp sid, lagrar värdena i en tabellvariabel och returnerar tabellvariabeln som functionsresultat.
Ooops, det låter nästan som att det skulle vara mer belastande för databasen än att göra den dynamisk?
Varför det?
Det var bara en fråga. ;)
Som alltid när man funderar på vad som är bäst ur prestandasynpunkt: Testa.
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!
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]
Tack åter igen toha (å Brimba å LarsG).
Det där funkade ju som smort. :)