Bonjour,

Je me pose des questions sur un problème que j'ai rencontré en voulant importer le contenu d'un fichier excel dans une de mes bases de données.

J'execute pour cela un petit bout de code T-SQL qui ressemble à cela :



Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
SELECT * 
INTO #myExcelData
FROM OPENROWSET (      
  'Microsoft.ACE.OLEDB.12.0',
  'Excel 8.0;Database=c:\Fichier.xls;HDR=YES;IMEX=1', 
  'SELECT Civilité,Nom,Prénom,Fonction,Organisme,Adresse1,Adresse2,CP,Ville,Téléphone,Fax,Email FROM [Export$]'
)
 
declare row_cursor cursor for select Civilité,Nom,Prénom,Fonction,Organisme,Adresse1,Adresse2,CP,Ville,Téléphone,Fax,Email from #myExcelData
 
open row_cursor 
fetch next from row_cursor into @ADRCONTACTINTITULE,@ADRCONTACTNOM,@ADRCONTACTPRENOM,@ADRCONTACTFONCTION,@ORGANISME,@ADR1,@ADR2,@ADRCP,@ADRVILLE,@ADRTEL,@ADRFAX,@ADRMAIL
while @@FETCH_STATUS=0
begin
     INSERT INTO ....
 
      INSERT INTO ....
 
    fetch next from row_cursor into @ADRCONTACTINTITULE,@ADRCONTACTNOM,@ADRCONTACTPRENOM,@ADRCONTACTFONCTION,@ORGANISME,@ADR1,@ADR2,@ADRCP,@ADRVILLE,@ADRTEL,@ADRFAX,@ADRMAIL
end
close row_cursor
deallocate row_cursor
Lorsque j'execute ce code sur le serveur, un systemOutOfMemory apparait sur la fin du traitement.
Les insert into réalisés dans la boucle font appels à des triggers qui eux-même font des insert. L'erreur ne se produit pas sur tous les serveurs (seulement ceux ayant une configuration mémoire moindre)
J'en ai donc déduis qu'il s'agissait d'un problème de verrous mais je ne comprends pas comment cela peut se produire puisque le traitement est lancé lorsqu'il y a aucun accès concurrent.
Le code n'est il pas exécuté de manière purement séquentiel? Est il possible qu'une nouvelle itération de ma boucle commence avant même qu'un trigger déclenché par l'itération précédente est terminé son traitement?

Merci d'avance pour vos lumières.