Il y a maintenant une 4ème option - paramètres de table , dans lequel vous pouvez en fait transmettre une table de valeurs à une sproc en tant que paramètre, puis l'utiliser comme vous le feriez normalement avec une variable de table. Je préférerais cette approche à l'approche d'analyse XML (ou CSV)
Je ne peux pas citer de chiffres de performance entre toutes les différentes approches, mais c'est celle que j'essaierais - je recommanderais de faire de vrais tests de performance sur eux.
Modifier :
Un peu plus sur les TVP. Afin de transmettre les valeurs à votre sproc, il vous suffit de définir un SqlParameter (SqlDbType.Structured) - la valeur de celui-ci peut être définie sur n'importe quelle source IEnumerable, DataTable ou DbDataReader. Donc, probablement, vous avez déjà la liste de valeurs dans une liste/un tableau quelconque - vous n'avez rien à faire pour la transformer en XML ou CSV.
Je pense que cela rend également le sproc plus clair, plus simple et plus maintenable, offrant un moyen plus naturel d'atteindre le résultat final. L'un des principaux points est que SQL fonctionne mieux dans les activités de manipulation basées sur des ensembles / sans boucle / sans chaîne.
Cela ne veut pas dire qu'il fonctionnera très bien avec un grand ensemble de valeurs transmises. Mais avec des ensembles plus petits (jusqu'à ~ 1000), cela devrait aller.