Det finns nu ett fjärde alternativ - tabellvärderade parametrar , där du faktiskt kan skicka en tabell med värden till en sproc som en parameter och sedan använda den som du normalt skulle göra med en tabellvariabel. Jag skulle föredra detta tillvägagångssätt framför XML (eller CSV-analysmetoden)
Jag kan inte citera prestationssiffror mellan alla olika tillvägagångssätt, men det är en jag skulle försöka - jag rekommenderar att du gör några riktiga prestandatester på dem.
Redigera:
Lite mer om TVP. För att skicka in värdena till din sproc definierar du bara en SqlParameter (SqlDbType.Structured) - värdet på denna kan ställas in på vilken IEnumerable, DataTable eller DbDataReader källa som helst. Så antagligen har du redan listan med värden i en lista/array av något slag - du behöver inte göra något för att omvandla den till XML eller CSV.
Jag tror att detta också gör sprocen tydligare, enklare och mer underhållbar, vilket ger ett mer naturligt sätt att uppnå slutresultatet. En av huvudpoängerna är att SQL presterar bäst vid setbaserade/inte looping/icke-strängmanipuleringsaktiviteter.
Det betyder inte att det kommer att prestera bra med en stor uppsättning värden som skickas in. Men med mindre uppsättningar (upp till ~1000) borde det vara bra.