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 :
Lorsque j'execute ce code sur le serveur, un systemOutOfMemory apparait sur la fin du traitement.
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
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.
Partager