Mam plik XML. W nim sa jakieś dane. Niektóre są zawarte jako wartość
elementów, inne jako atrybuty. Chciałbym, wczytać te dane do tabeli.
Próbowałem w ten sposób:
-- wczytaj plik XML do tabeli
DECLARE @lQuery NVARCHAR(1000);
SET @lQuery = 'INSERT INTO plikiXML( PLIK, DANE ) ' +
' SELECT ''' + @aNazwaPliku + ''', xmlData ' +
' FROM' +
' (' +
' SELECT *' +
' FROM OPENROWSET (BULK ''' + @aNazwaPliku + ''' ,
SINGLE_BLOB) AS xmlDATA' +
' ) AS FileImport (xmlDATA)';
EXEC sp_executesql @lQuery;
Powyższy kod działa. Wczytuje plik XML i rejestruje go w pojedynczym
wierszu tabeli plikiXML. Teraz chciałbym go sparsować i wrzucić do
innej tabeli, w formie drzewka. Robię to tak:
DECLARE @lHDoc int;
DECLARE @lDoc xml;
-- pobierz XML do parsowania
SELECT @lDoc = DANE
FROM plikiXML
WHERE IdPliku = @aIdPliku;
-- przygotuj dokument do parsowania
EXEC sp_xml_preparedocument @lHDoc OUTPUT, @lDoc
-- utworz tabele tymczasowa dla potrzeb parsowania
CREATE TABLE ##RPX (
NDID int, -- identyfikator wezla
NDRO int, -- identyfikator rodzica
NDTP int, -- typ wezla
NDNZ nvarchar(100), -- nazwa wezla
NDPO int, -- identyfikator poprzedniego wezla
NDWR nvarchar(100) -- wartosc wezla
);
-- parsuj dokument
INSERT INTO ##RPX ( NDID, NDRO, NDTP, NDNZ, NDPO, NDWR )
SELECT [ID], [PARENTID], [NODETYPE], [LOCALNAME], [PREV], [TEXT]
FROM OPENXML ( @lHDoc, '/komunikat' )
-- zwolnij dokument
EXEC sp_xml_removedocument @lHDoc
Powyższy kod też mi działa i w wyniku otrzymuję tabelę tymczasową
##RPX z danymi o strukturze drzewka. Problem pojawia się w momencie,
gdy chcę wrzucić plik XML o dużym rozmiarze (ok. 500 tys. wezłów).
Parsowanie i wrzucanie tego do tabeli trwa u mnie dobrych kilka
godzin, co jest dla mnie niedopuszczalne.
Czy istnieje jakaś inna metoda, która pozwoliłaby mi skrócić czas
ładowania danych do tabeli?
Dodam, że struktura pliku XML jest dla mnie znana z góry.
Sebastian
Powy�szy kod te� mi dzia�a i w wyniku otrzymuj� tabel� tymczasow�
##RPX z danymi o strukturze drzewka. Problem pojawia si� w momencie,
gdy chc� wrzuci� plik XML o du�ym rozmiarze (ok. 500 tys. wez��w).
Parsowanie i wrzucanie tego do tabeli trwa u mnie dobrych kilka
godzin, co jest dla mnie niedopuszczalne.
Czy istnieje jaka� inna metoda, kt�ra pozwoli�aby mi skr�ci� czas
�adowania danych do tabeli?
Dodam, �e struktura pliku XML jest dla mnie znana z g�ry.
<ciach>
a moze da rade:
SELECT
tab.col.value('pole1[1]', ' nvarchar(10)') As pole1,
...
from @xVar.nodes('//path/path') tab(col)
gdzie @xVar jest typu XML i zawiera caly plik xml
AJA