Bonjour,

Dans le cadre d'une optimisation d'un outil d'import de données, je suis à la recherche d'une solution la plus efficace possible pour insérer en masse des données issues de fichiers CSV de taille très variable (certains peuvent faire près de 1 Go).

Au départ, je suis bêtement parti sur du BULK INSERT.
Sauf que daprès la documentation :
- Le CSV n'est pas pris en charge
- Visiblement les données non textuelles doivent être stockées en binaire dans le fichier (si j'ai bien compris)
Bref, ça n'a pas l'air d'être la bonne solution.

Reste donc le chargement des données à l'aide d'un programme, qui va parser le CSV et va l'importer sous forme de INSERT.

Sauf que SQL Server ne supporte pas les INSERT de plusieurs lignes (tout du moins, pas avec la clause VALUES).

Restent donc différentes solutions, et j'espère d'autres :
Passer par une table temporaire :
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
insert into #tmp values (...);
[...]
insert into #tmp values (...);
 
insert into destination select * from #tmp;

Faire un INSERT de SELECT :
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
with cte (...)
as
(
   select ...
   union all
   [...]
   select ...
)
insert into destination select * from cte;

Éventuellement un mix des deux (?).

Je souhaite ne pas passer par un fichier intermédiaire (genre pas moyen de recopier le CSV dans un format compatible avec le bulk insert).

Les éventuels triggers et autres contraintes doivent être respectés.

Il ne doit pas y avoir d'interruption de service au niveau de la base.