Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: pp 26. 07. 2017, 09:25:40
-
V praci som dostal za ulohu vytvorit appku, ktora spravi export z par DB tabuliek do suboru a nasledne bude robit import do inej tabulky, ale s tym, ze ten import bude podliehat nejakej logike. Myslim ze to bude nieco v zmysle, importuj do tabulky len tie data, ktore sa zhoduju s nejakou uz existujucou hodnotou v danej tabulke. Neviem ci je potreba implementovat nejaku C# konzolovku nato, ale myslim si, ze nieco taketo by islo vyriesit aj cez SQL (T-SQL nakolko vyuzivame MS SQL).
-
To musíš zvážit podle druhu operací, které bude třeba s daty dělat. V MS SQL se dá použít: https://docs.microsoft.com/en-us/sql/integration-services/sql-server-integration-services
-
Pokud mas MSSQL
pouzij bcp utilitu a bulk insert
-
Nestačí prostě něco ve stylu viz níže?
INSERT INTO ... SELECT ... FROM ... WHERE ... ;
IMHO lepší než exportovat a pak importovat. Případně se dají udělat dočasné tabulky a použít další mezikroky:
CREATE TEMPORARY TABLE t1 AS SELECT ... FROM ... WHERE ... ;
-- tady udělat další tabulky, pospojovat, promazat atd. a nakonec:
INSERT INTO ... SELECT ... FROM t1 WHERE ... ;
A vhodně to uzavřít do transakce, aby to byl pod kontrolou stav, pokud se něco nepovede.
-
mam taky mensi problem. snazim sa exportovat query do xml suboru.
:XML ON
select ....
FOR XML PATH('Item'), ROOT('Items'), TYPE
toto mam ulozene v skripte a potom cez utilitku sqlcmd robim to, aby mi to vykonalo ten select a rovno ulozilo do xml suboru. problem je, ze ten select vrati strasne vela zaznamov a vysledny XML subor je useknuty na velkosti 1mb. Povodne by mal mat cez 200mb. utilitu bcp (xp_cmdshell nie je povelene)
-
resp. z toho query je vytvorene velke XML a sqlcmd to nejak nedokaze ulozit. niekde som sa docital, ze to ma obmedzenie na 1mb.
-
Nedrbejte se pravou rukou za levým uchem :) Udělejte ty operace rovnou v db jak jsem psal, pokud tomu nic nebrání.
-
Na některých db (MSSQL,...) lze udělat i INSERT INTO prvniDb.table(...) SELECT FROM druhaDb.table(...). Odpadá tak nutnost dump/load.
Většina i free nástrojů umí do kopírovat v rámci jednoho výrobce a některé i do určité míry kopírovat mezi db různých výrobců.
Pokud máte dělat kopii dat mezi různými databázemi, v Javě je ideální možnost:
- otevřít JDBC spojení do db1
- otevřít JDBC spojení do db2
- db2.prapareStatement("Insert INTO....")
- db.open scrollable forward only cursor
- for i < columnCount
- db1.ResultSet.getObject(i)
- preparedStatement.setObject(i)
[předpokládá se úplně stejná struktura]
Velkou výhodou komba getObject/setObject je, že se vůbec nemusíte zalamovat s datovými typy - JDBC drivery udělají vše za vás!
A lze to i vylepšit - program jako argument dostane konfigurační stringy databází + název tabulky a přes metadata si zjistí názvy sloupců, vybuduje si SELECT i INSERT INTO a pak máte absolutní jistotu, že data budou v těch samých sloupcích.
Dá se to všemožně optimalizovat (bulk inserty, granularita,...), ale obvykle toho není třeba.
A takovýto low-level přístup je mnohem lepší v situaci, když musíte řešit zvláštnosti (přemapování dat, konverze codePage, B/CLOBy,...), které s běžnými nástroji nezvládnete. A je to lepší než dělat XML dump-->XSLT-->XML load, protože když už je vaše XSLT vyladěná do maxima, vždycky přijde někdo s požadavkem "a tyhle řádky začínající na xyz chceme zpracovat jinak":-) V kódu si s tím poradíte raz dva, v XSLT to ladíte hodinu.
Hodně štěstí!