Bien qu'il puisse sembler que moins de code à traiter devrait vous donner un gain de performances, utiliser la première option (union all) est une mauvaise idée. Toutes les instructions select doivent être analysées et exécutées avant que les données ne soient insérées dans une table. Cela consommera beaucoup de mémoire et peut prendre une éternité, même pour une quantité de données relativement faible. D'autre part, les instructions d'insertion séparées sont exécutées "à la volée".
Exécutez un test simple dans SSMS qui le prouvera :créez une table simple avec 4 champs et essayez d'insérer 20 000 lignes. La deuxième solution s'exécutera en quelques secondes, tandis que la première... vous verrez :).
Un autre problème est que lorsque les données ne sont pas correctes dans une ligne (incompatibilité de type par exemple), vous recevrez une erreur du type Conversion failed when converting the varchar value 'x' to data type int.
, mais vous n'aurez aucune indication sur la ligne qui a échoué - vous devrez la trouver vous-même. Mais avec des insertions séparées, vous saurez exactement quelle insertion a échoué.