È ora disponibile una quarta opzione:parametri con valori di tabella , per cui puoi effettivamente passare una tabella di valori a uno sproc come parametro e quindi utilizzarlo come faresti normalmente con una variabile di tabella. Preferirei questo approccio rispetto all'XML (o approccio di analisi CSV)
Non posso citare i dati sulle prestazioni tra tutti i diversi approcci, ma è quello che proverei:consiglierei di eseguire dei veri test delle prestazioni su di essi.
Modifica:
Un po' di più sui TVP. Per passare i valori al tuo sproc, definisci semplicemente un SqlParameter (SqlDbType.Structured) - il valore di questo può essere impostato su qualsiasi origine IEnumerable, DataTable o DbDataReader. Quindi presumibilmente hai già l'elenco di valori in un elenco/array di qualche tipo:non devi fare nulla per trasformarlo in XML o CSV.
Penso che questo renda anche lo sproc più chiaro, più semplice e più manutenibile, fornendo un modo più naturale per ottenere il risultato finale. Uno dei punti principali è che SQL si comporta al meglio con attività basate su set/non loop/non manipolazione di stringhe.
Questo non vuol dire che funzionerà alla grande con un ampio set di valori passato. Ma con set più piccoli (fino a ~1000) dovrebbe andare bene.