Optimisation requete SQL

Signaler
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
-
Messages postés
22
Date d'inscription
mardi 3 mars 2009
Statut
Membre
Dernière intervention
3 mars 2009
-
Bonjour à tous,

Je programme actuellement un petit code permmetant d'acceder a SQL sever Express (en utilisant ado)
à un moment je dois rentrer un tableau C++ de 2 dimensions dans une table de ma base SQL, je fais donc :

 for ( i=0; i<NX_TMP; i++ )
   {
      // For all Y points
      for ( j=0; j<NY_TMP; j++ )
      {
           strcpy(strExec, "UPDATE MaTable SET ");
         sprintf(temp," Tmp = %f",tmp);
         strcat(strExec,temp);
         sprintf(temp," WHERE nx = %d",i);
         strcat(strExec,temp);
         sprintf(temp," AND ny = %d",j);
         strcat(strExec,temp);
    }
 try
         {
            // Insere des éléments            //             HRESULT retour recordset->Open(strExec,
                connection.GetInterfacePtr(), adOpenForwardOnly,
                adLockReadOnly, adCmdText);
         }
}

le probleme c'est que cela génere donc NX * NY requete (dans mon cas precis 6000)
je voudrais savoir si il n'y a pas moyen d'optimiser tout ceci en une seule requete et de rentrer mon tableau 2D d'un seul coup?

je ne connais malheureusement de SQL que les requetes basiques SELECT, UPDATE etc...
donc si une ame charitable voulait bien m'aider Merci d'avance.

 

10 réponses

Messages postés
361
Date d'inscription
mardi 31 décembre 2002
Statut
Membre
Dernière intervention
19 mars 2015

un truc comme ça ? :
UPDATE MaTable SET Tmp = "ta valeur de tmp" WHERE nx >= 0 AND nx < NX_TMP AND ny >= 0 AND ny < NY_TMP
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
oui mais Tmp n'est pas fixe ....

 
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
en fait imaginons un tableau 2d sous C++ et je voudrais le rentrer dans une table SQL en 1 seule requete...
comment faire cela?

pr arriver a avoir

X     |     Y
0            5
12          3
...           ...
59           21

etc....
remplir cette table en 1 requete!

 
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
c'est impossible? de faire ca d'un seul trait ? obligé de faire mes boucles sur les requetes?

 
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
24
Regarde 'BULK' dans MSDN.

ciao...
BruNews, MVP VC++
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
Salut brunews,

merci de me guider! je viens de lire pas mal de choses rapidement sur BULK INSERT et a priori on peut insérer des données en bloc dans une table
ce qui repondrait a ma problématique... mais j'ai vu que c'était à partir d'un fichier hors moi je dois faire ca a partir d'une structure C++.
je vais continuer à lire des forums et des aides dessus mais si tu pouvais STP, m'aiguiller encore un peu plus ca serait magnifique 

 
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
24
Je viens de voir que la méthode 'Update' de ADO 2.8 semble répondre précisément à ce que tu veux faire.

ciao...
BruNews, MVP VC++
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
re,

j'ai trouver cette aide :
VI-D-16. Update

Sauvegarde les modifications apportées à l'enregistrement en cours. De la forme :

recordset.Update Fields, Values

Où Fields et Values sont la liste des champs et des valeurs à modifier (facultatif).

VI-D-17. UpdateBatch

Met à jour toutes les modifications en attente (opération par lot). De la forme

recordset.UpdateBatch AffectRecords

Où AffectRecords définit les enregistrements concernés.

Si toutes les modifications échouent, une erreur
se produit, s'il n'y a que quelques échecs, ils sont ajoutés à la
collection Errors de la connexion.

je suis pas sur que ca reponde a mon soucis d'enregistrements d'un tableau directement!
 
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
VI-D-17. UpdateBatch




Met à jour toutes les modifications en attente (opération par lot). De la forme









recordset.UpdateBatch AffectRecords








Où AffectRecords définit les enregistrements concernés.









Si toutes les modifications échouent, une erreur se produit, s'il n'y a
que quelques échecs, ils sont ajoutés à la collection Errors de la
connexion.

a priori faut faire quelque chose de ce genre, une opération par lot de requetes!!!
je vais essayer de trouver un exemple simple et concret....







 
Messages postés
22
Date d'inscription
mardi 3 mars 2009
Statut
Membre
Dernière intervention
3 mars 2009
2
 Il peut aussi être utile d'envoyer un tableau en XML (via OPENXML dans le code SQL) à une procédure stockée. Utile si vous envoyez un tableau à usage unique