Requete SQL INSERT tableau 2D dans table sql

LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 - 30 janv. 2008 à 13:42
LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 - 21 janv. 2009 à 11:36
Bonjour,

je debute en SQL, je precise avant tout!
je programme actuellement un petit logiciel sous VC++ et j'effectue quelques requetes SQL pour attaquer une base SQL SERVER EXPRESS

je me retrouve confronté à un probleme pour insérer ou faire un update d'une table avec un tableau 2dimensions tab[50][200]
je voudrais pouvoir insérer chaque élement de ce tableau dans ma table et ce ci en une seule requete
car actuellement je fais une requete pr chaque element : tab[0][0] puis tab[0][1] etc.... -->tab [50][200]
ce qui me donne enormement de requetes au final!

je voudrais donc savoir si il n'y a pas moyen de changer ma requete ou ma table pour insérer mon tableau entier en 1 seule requete...
Merci de votre aide !

 

13 réponses

nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
31 janv. 2008 à 22:06
Salut

Si c'est la meme valeur, c'est un
update matable
set value = valeur

si c'est une plage
update matable
set value = valeur
where id = (select id from matable ...jointure  where ..)

si toutes valeurs c'est different c'est 1 requete par valeur
mais il est possible de faire des :lots
en concatenant les requetes dans la meme commande ado
a la place de faire un update par commande

pour les insertions
il existe les bulk insert

bon courage
0
LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 1
1 févr. 2008 à 09:37
Salut et merci,
je me situe dans ce cas la :
"si toutes valeurs c'est different c'est 1 requete par valeur
mais il est possible de faire des :lots
en concatenant les requetes dans la meme commande ado
a la place de faire un update par commande"

aurais tu un exemple pour un lot de requetes STP?
sinon,
Bulk INSERT j'avais trouver mais ca ne correspond pas car a priori ca permet d'insérer le contenu d'un fichier...

 
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
1 févr. 2008 à 15:23
C'est simple tu mets toutes les requetes à la queuleuleu séparé par un ;

Et apres tu lances tout dans la même commande

Attention, il faut eviter que ta commande sont trop grosse pour eviter d'engorger
SQL server (il faut pas je pense mettre 1 millions de update dans une commande par exemple) faire des lots de 1000 ou 2000 requetes doit etre intérressant.
0
LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 1
1 févr. 2008 à 17:42
ok merci je vais faire le test lundi matin
par 1000? bon c'est deja ca...
la j'en ai pr ce coup 6000 a faire on verra ce que ca donne :-)

merci encore !

 
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 1
4 févr. 2008 à 10:57
Salut,

Bon apres tests j'ai réussi à effectuer un lot de 6000 requetes en 42secondes....
ce qui me parait assez performant, le probleme est que pour mon programme c'est bien trop lourd
car beaucoup de choses à gérer...

arf arf arf

 
0
LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 1
4 févr. 2008 à 11:14
et en effectuant mes requetes 1 par 1 ca donne 47secondes....donc effectivement il y a un gain mais moindre!
dommage pour moi!

je vais peut etre pour cette partie me rabattre vers un transfert de fichier :-(

 
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
4 févr. 2008 à 12:11
c'est des temps SQL profiler ou des temps montre en main
0
LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 1
4 févr. 2008 à 13:11
j'ai pris le temps d'execution de mon programme C++ en mettant un difftime avant et juste apres l'appel de la fonction !

 
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
4 févr. 2008 à 20:26
As-tu des index sur ta table dans laquelle tu inseres si oui tu les supprimes et tu les rejoutes apres?
As-tu des triggers sur les insertions?

Il y a surement une cause. Et ton temps est juste le test SQL, d'insertion, il y a pas de code avant et apres le code SQL.
Il y a pas d'opération de chaine de caracteres trop importante, car ca plombe la mémoire des fois.
dans des langages avec VM c#, java et autre les strings sont immuables et donc
reconstruites a chaque fois en c++ je ne sais pas comment, c'est géré.

Bon courage.
0
LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 1
5 févr. 2008 à 11:00
alors non je n'ai pas d'index, ni de triggers la table est défini simplement avec 3 champs ...

le temps est au debut et a la fin de la fonction et non pas de la requete mais a mon avis c'est pareil...
les opérations de chaines de caracteres pour créer mes requetes ont l'air de se passer en moins d'une seconde...

a mon avis 6000 requetes en 45secondes c'est le mieux possible, non? ca fait 0.005sec par requete!
t'en penses quoi?

 
0
LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 1
5 févr. 2008 à 11:17
la requete en elle meme met environ 38 secondes a s'effectuer...
le probleme est que a chaque appel de cette fonction je dois reconstruire mes chaines
donc en gros faut qd mm compter 45sec a chaque appel
et dans mon cas ce n'est pas acceptable, malheureusement!

 
0
bekri_abd Messages postés 5 Date d'inscription samedi 29 juillet 2006 Statut Membre Dernière intervention 21 janvier 2009
21 janv. 2009 à 11:32
utilise un procedure stockee dans la base avec autant de parammetres  que dans le tableau
avec un insert into 
puit dans ton prgramme tu appelle la procedure dans une  boucle en parcourant le tableau
jusqu'a la fin  en prenant comme parammetres les donnees du tableau

tu evite  d'ecrire la requte plusieur foix

merci
0
LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 1
21 janv. 2009 à 11:36
salut,

comment fait on cette procedure stockée? je ne suis pas sur de bien comprendre la marche a suivre...

peut etre un exemple m'y aiderai!

merci!

 
0
Rejoignez-nous