Nu e chiar intrebare de Windows, dar nu exista nici un topic de "programare, diverse intrebari" si nu as face unul doar pentru o chestie cu aplicabilitate extrem de restransa.
Am o problema mai ciudata: vreau sa citesc niste date dintr-o tabela din SAP si sa le scriu intr-o tabela in SQL. OK, nu chiar o tabela ci vreo 4-5, dar procesul e identic si ordinul de marime e similar, deci daca aflu cum sa o fac bine pentru o tabela pot reaplica.
Tabela are cam 100.000 de inregistrari, sa zicem. In fapt cea mai mica are cam 80.000, cea mai mare 600.000, dar nu e o diferenta foarte mare. In acest moment singurul mod in care pot citi inregistrari e prin cate un web service folosit oData. Cum SAP e inca la oData ver 2, formatele disponibile sunt XML si JSON verbose - primul are cam 100MB si al doilea cam 50MB. Intrucat riscul de a umbla cu asemenea volum e cam mare (o fac printr-un script PHP cu limita de memorie 128 MB per proces) si intrucat procesul dureaza cam mult si risc sa pice sau sa dea un timeout, citesc cate 5000 de inregistrari odata si le scriu, repet pana termin tabela - oData are notiunile de TOP si SKIP, deci e banal de facut o bucla pentru asa ceva.
Problema 1: datele care vin ajung sa le citesc cate o inregistrare (linie) odata, element cu element, si sa le scriu in SQL cu cate un INSERT INTO tabela (col1, col2...) VALUES( val1,val2...). Asta pentru ca XML-ul care vine din SAP are o structura pe care nimeni nu prea o intelege din prima ca sa citesc tot calupul de 5000 de inregistrari direct intr-un recordset, iar cele JSON nu am reusit nici macar sa le citesc in vreun fel din cauza de namespaces cretine si lipsa mea de pricepere in a lucra cu JSON si namespaces. Sugestii despre alta abordare a problemei? Aici e o discutie despre problema, rezolvarea (aproximativa, aplicabila pentru o singura inregistrare) e fix cititul element cu element:
http://stackoverflow.com/questions/...element-not-parsing-correctly-with-namespaces
Problema 2: sa zicem ca am un recordset cu cele 5000 de inregistrari x Y coloane (intre 5 si 10, in functie de tabel). Cum pot sa le scriu pe toate odata in SQL? Sintaxa cu INSERT INTO tabel (col1, col2..) VALUES (val11, val12..), (val21, val22...), etc. nu merge pentru ca e limitata la 1000 de inregistrari si oricum ar rezulta un string pentru acel select de cativa mega.
In acest moment ca sa procesez un bloc de 5000 de inregistrari dureaza cam 15 secunde local pe serverul de SQL: sub 2 secunde citirea datelor prin ODATA, restul pana la 15 e scrierea in SQL cu pipeta. Problema e ca daca imi ia cate 5 minute per tabela si sunt 4-5 tabele (teoretic o pot face in paralel, practic nu stiu cat de bine o sa mearga), iar operatia ruleaza de 4 ori pe zi, actualizarea tabelelor respective ajunge sa ia o perioada semnificativa, 30-45 de minute la fiecare 6 ore. Probabil e cea mai proasta metoda de a actualiza date intre tabele din sisteme eterogene daca nu gasesc o metoda de a mari performanta cu un ordin de marime, reducand timpul total la cateva minute.