Triturazione XML da DB usando SSIS
Domanda
Sto cercando un modo per tirare XML da un database SQL e sminuzzare l'XML tramite SSIS alla rinfusa. Al momento ho un pacchetto che può tirare XML dal database e passare l'XML a una stored procedure, tramite variabili, per la triturazione, ma questo funziona solo 1 record per volta. Durante la lavorazione di 100.000 record, questo può diventare abbastanza tempo.
Vorrei valori XML multipli brandello contemporaneamente utilizzando SSIS. Questo è possibile con SSIS? Forse qualcosa in un Flusso di dati in cui tutti i valori XML sono selezionati da una fonte poi passato ad un parser di qualche tipo?
Soluzione
So after a lot of searching and thinking about the problem, I redesigned the stored procedures that did the shredding. Instead of shredding a variable being passed into the stored procedure, I just shredded from the XML column itself. This allowed me to shred many XML values at once instead of looping and passing them to a stored procedure one at a time. This gave me the performance boost I was looking for. So instead of something like this...
SET @xmlData = CAST(@xmlMessageData AS XML)
SELECT
, row.value('xmlNode1[1]', 'BIT' ) AS Column1
, row.value('xmlNode2[1]', 'NVARCHAR(255)') AS Column2
, row.value('xmlNode3[1]', 'BIT' ) AS Column3
, row.value('xmlNode4[1]/Name[1]', 'NVARCHAR(255)' ) AS Column4
FROM @xmlData.nodes('xmlRootNode') AS T1(row)
I now do this...
SELECT
, row.value('xmlNode1[1]', 'BIT' ) AS Column1
, row.value('xmlNode2[1]', 'NVARCHAR(255)') AS Column2
, row.value('xmlNode3[1]', 'BIT' ) AS Column3
, row.value('xmlNode4[1]/Name[1]', 'NVARCHAR(255)' ) AS Column4
FROM [ESBMessagesData] D
CROSS APPLY
[DataItem].nodes('xmlRootNode') AS T1(row)