XML från fil till SQL (via CLR?)

Permalänk
Avstängd

XML från fil till SQL (via CLR?)

Hej. Jag håller på att försöka göra en rutin för att läsa in en stor XML-fil och stoppa allt i en databas i SQL. Jag håller på att få till en Stored Procedure i C#/.Net som läser in filen ett objekt i taget och skriver det till databasen m.h.a. XmlSerializer och XSD bland annat men det känns som om det borde finnas en smidigare lösning. MS SQL Server kan hantera XML till viss del i senare versioner men tydligen inte direkt från en fil utan den måste importeras på något sätt. Alla sätt jag hittar läser hela filen i ett svep och sen "parsear" den till SQL men det fungerar inte med en så stor fil som jag har (över 40GB, simpel data bara mycket av den).

Frågan är då: Finns det något bättre sätt? Kan man exempelvis lägga XML-filen på serven och få den att fungera som typ en databas på nåt sätt?

All hjälp och alla tips uppskattas.

Permalänk
Medlem

Importera den till Excel och importera därifrån.

Hur man importerar: http://support.microsoft.com/kb/321686

Visa signatur

Ingen är perfekt inte ens Najk!

Permalänk
Medlem

Jag meckade med något liknande för ett bra tag sedan. I mitt fall så ville jag överföra data från en MySQL databas med kasst upplägg till en bättre designad MS SQL variant. Problemet jag hade var i och för sig att jag fick en massa irriterande time outs som störde överföringen. Men lösningen borde vara liknande.

SqlBulkCopy låter en läsa från en källa och skriva till en annan.
DataTable och DataRow håller data i ett format som matchar databasen man jobbar med.

I mitt fall konstruerade jag de nya tabellerna och läste in hela den gamla databasen (under 100 MB) via lite logik till ett par DataTable-instanser. Sedan var det bara att skriva dem med SqlBulkCopy.WriteToServer().

I ditt fall så kan det nog vara idé att skapa en buffer med DataRow[]. Läs så mycket data du kan från XML-filen och dumpa till servern när buffern är full.

Om någon vet om man kan lägga in ett "filter" mellan två strömmar så vore det intressant att höra om.

Visa signatur

.<

Permalänk
Avstängd

Tack för hjälpen. Lösningen blev att dela upp processen i några mindre Stored Procedures. En för att ta ner en zippad fil från ftp, en för att unzippa den till xml och en för att skapa objekt från xml och stoppa i dem i databasen. Så länge jag läser och skriver ett objekt i taget så fungerar det utan att minnet tar slut.