Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Odbacivanje samo neispravnih slogova pri INSERT-u grupe slogova u tabelu?

[es] :: MS SQL :: Odbacivanje samo neispravnih slogova pri INSERT-u grupe slogova u tabelu?

[ Pregleda: 2300 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

teri_kalijer

Član broj: 335009
Poruke: 13
91.143.216.*



Profil

icon Odbacivanje samo neispravnih slogova pri INSERT-u grupe slogova u tabelu?12.10.2016. u 11:27 - pre 90 meseci
Potrebna mi je pomoć sa problemom na koji sam naišao kod INSERT-a grupe slogova u tabelu.

Ako se ne varam, u MS SQL Serveru, pri INSERT-u grupe slogova u tabelu (INSERT INTO ... SELECT * FROM), zbog atomičnosti transakcije, ako neki od slogova nije ispravan iz ovog ili onog razloga, cela grupa slogova biće odbačena.
To je u redu.

Sad, imam neku veću obradu: učitavanje slogova u bazu iz gomile XML fajlova. XML fajlovi se parsiraju i podaci iz njih se učitaju u privremene tabele, zatim se iz njih, ako podaci već ne postoje u bazi, kroz SELECT * radi INSERT slogova u bazu, u mnogobrojne stalne tabele.

Bilo bi poželjno da, pri tom 'grupnom' INSERT-u slogova iz privremenih u stalne tabele, ako neki od slogova nije ispravan, ne budu odbačeni svi slogovi, već samo neispravni.
Tako da je moje glavno pitanje: da li je to moguće - nekako 'reći' MS SQL-u da, pri jednom 'grupnom' INSERT-u, odbaci samo te neispravne slogove, a učita ispravne?

Alternativa mi je da učitavanje radim 'pešaka': kroz petlju čitati slog po slog iz privremene tabele, započeti transkaciju, zatim pokušati INSERT u stalnu tabelu. Ako nema greške, COMMIT-ujem transakciju i čitam novi slog, u protivnom hendlujem neispravni slog. Međutim, to bi dosta usporilo obradu, koja je i ovako zahtevna.

Zbog prirode obrade i brojnih INNER JOIN-ova koji se, tokom učitavanja, uspostavljaju između privremenih i stalnih tabela, BULK INSERT nije zgodna opcija.
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+710 Profil

icon Re: Odbacivanje samo neispravnih slogova pri INSERT-u grupe slogova u tabelu?12.10.2016. u 12:31 - pre 90 meseci
A zašto ne pokušaš da doradiš svoj SELECT tako da ne vuče recorde koji nisu validni?
 
Odgovor na temu

teri_kalijer

Član broj: 335009
Poruke: 13
91.143.216.*



Profil

icon Re: Odbacivanje samo neispravnih slogova pri INSERT-u grupe slogova u tabelu?12.10.2016. u 13:30 - pre 90 meseci
Hvala ti na odgovoru :).

Ne dorađujem SELECT zato što ima veliki broj tabela u koje se podaci učitavaju i njihove relacije su složene. Bilo bi potrebno poći od tabele do tabele, analizirati strane ključeve i sva postojeća ograničenja na poljima tabela i ugraditi sve to u SELECT naredbe da bi dobili garanciju da neće doći do pucanja pri INSERT-u. Jer kad krene INSERT, milion slogova recimo, dovoljno je da jedan slog ima jedan nevalidan podatak i SVI slogovi biće odbačeni. Tuga.

Kako god, izgleda da me to očekuje - da pođem od tabele do tabele i dorađujem SELECT - jer ne vidim jednostavnije rešenje koje bi bilo dovoljno efikasno. Ipak, pre nego što krenem tim (mukotrpnim) putem, želeo sam da proverim podržava li MS SQL opciju da pri grupnom INSERT-u budu odbačeni samo nevalidni slogovi.
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+710 Profil

icon Re: Odbacivanje samo neispravnih slogova pri INSERT-u grupe slogova u tabelu?12.10.2016. u 14:50 - pre 90 meseci
Takođe, malo mi je sumnjivo da je ubacivanje slog po slog TOLIKO sporije od ubacivanja jednim upitom. Prvo bih to empirijski proverio. Takođe, prednost izvršavanja upit po upit je i to što imaš individualne poruke o greškama.

BTW, MSSQL ima dobru podršku za stored procedure, tako da sve individualne upite možeš da pokreneš na samoj bazi. U tom slučaju bi me baš začudilo da je dužina obrade znatno duža nego jednim upitom.
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6041



+4631 Profil

icon Re: Odbacivanje samo neispravnih slogova pri INSERT-u grupe slogova u tabelu?12.10.2016. u 16:23 - pre 90 meseci
Brzina je priblizno ista ako radis u okviru iste transakcije, u surpotnom svaki insert vuce svoj zaseban locking, sto dotano usporava. Jedino sto nema sanse da to primeti ljudski operater, posto pricamo o mikrosekundama.

I naravno da moze da se radi selekcija u insert po "nekoj validnosti". Insert ne radi samo sa statickim izvorom podataka, moze podatke da vuce iz select podquerija: https://technet.microsoft.com/en-us/library/ms189872.aspx
jednostavno stavi svoj kriterijum u WHERE unutar SELECT-a
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+710 Profil

icon Re: Odbacivanje samo neispravnih slogova pri INSERT-u grupe slogova u tabelu?12.10.2016. u 16:31 - pre 90 meseci
Mislim da zna on to, ali ima previše constrainta koje bi morao da prepiše u SQL. Ovako mu lakše - zahvati sve, sipa u INSERT pa šta prođe, prođe. ;)
 
Odgovor na temu

anon115774

Član broj: 115774
Poruke: 1656



+920 Profil

icon Re: Odbacivanje samo neispravnih slogova pri INSERT-u grupe slogova u tabelu?12.10.2016. u 19:25 - pre 90 meseci
A koja je definicija "neispravnog sloga"?

Uradis update na privremenoj tabeli i oznacis (u novoj koloni) sve one neispravne i onda sa svim ostalim uradis insert into.
 
Odgovor na temu

teri_kalijer

Član broj: 335009
Poruke: 13
91.143.216.*



Profil

icon Re: Odbacivanje samo neispravnih slogova pri INSERT-u grupe slogova u tabelu?13.10.2016. u 13:58 - pre 90 meseci
Citat:
jablan:
Mislim da zna on to, ali ima previše constrainta koje bi morao da prepiše u SQL. Ovako mu lakše - zahvati sve, sipa u INSERT pa šta prođe, prođe. ;)


Upravo tako ;).


Solidno poznajem mogućnosti SELECT naredbe, i svestan sam da je pomoću nje i dinamički kreiranog SQL koda moguće napraviti moćan upit koji bi izdvojio samo ispravne slogove, koji bi garantovano bili upisani u bazu.
Međutim, da bi se to postiglo, broj provera koje u okviru tog SELECT-a treba sprovesti je pozamašan. Takođe, ima popriličan broj tabela (oko 50) i za svaku ponaosob potrebno je napraviti specijalizovani SELECT.
Ako uzmemo u obzir da u pojedinim tabelama ima stotine miliona slogova, čitava obrada mogla bi da se poprilično oduži.

I tako, ipak ću se opredeliti za učitavanje slog po slog, u petlji, svi slogovi u okviru jedne transakcije, i hendlovanje neispravnih slogova kroz BEGIN TRY ... END TRY. Isprobao sam, nije puno sporije od 'grupnog' INSERT-a.

Jablane, Mmix, hvala vam za pomoć, puno ste mi pomogli! :)

 
Odgovor na temu

[es] :: MS SQL :: Odbacivanje samo neispravnih slogova pri INSERT-u grupe slogova u tabelu?

[ Pregleda: 2300 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.