Вече има 4-та опция - параметри с таблични стойности , при което всъщност можете да подадете таблица със стойности в sproc като параметър и след това да го използвате, както обикновено бихте използвали променлива на таблица. Бих предпочел този подход пред XML (или подхода за анализ на CSV)
Не мога да цитирам данни за производителността между всички различни подходи, но това е един, който бих опитал - бих препоръчал да направите някои реални тестове за производителност върху тях.
Редактиране:
Малко повече за TVP. За да предадете стойностите във вашия sproc, вие просто дефинирате SqlParameter (SqlDbType.Structured) - стойността на това може да бъде зададена на всеки източник IEnumerable, DataTable или DbDataReader. Така че вероятно вече имате списъка със стойности в списък/масив от някакъв вид - не е необходимо да правите нищо, за да го трансформирате в XML или CSV.
Мисля, че това също прави sproc по-ясен, по-прост и по-поддържан, осигурявайки по-естествен начин за постигане на крайния резултат. Един от основните моменти е, че SQL се представя най-добре при дейности, базирани на набор/нециклични/неманипулиращи низове.
Това не означава, че ще се представи чудесно с голям набор от предадени стойности. Но с по-малки набори (до ~1000) трябва да е добре.