100 GB XML 到 SQL Server 数据库中

100 GB XML into SQL Server database

提问人:Morten Krogh 提问时间:11/7/2023 最后编辑:Morten Krogh 更新时间:11/11/2023 访问量:142

问:

我遇到了问题,既因为我不知道自己在做什么,还因为我的数据文件太大了。

TLDR:我已经下载了 SQL Server 2022 和 SQL Server Management Studio,需要将我的大文件导入到表中。

我有这个大约 100 GB 的 XML,其中包含来自丹麦的整个车辆注册表。我需要将其导入到表中,这样我就可以进行查找,没有什么比这更奇特的了。但我似乎不知道如何导入它。由于它的大小,我无法在 Microsoft Edge 以外的任何地方打开该文件。

这也让我感到困惑,我应该如何阅读我的文件,它没有根目录和东西,只有纯文本。

XML 文件的屏幕截图

下面是 XML 中第一行的示例

<?xml version="1.0" encoding="UTF-8"?>
<ns:ESStatistikListeModtag_I xmlns:ns="http://skat.dk/dmr/2007/05/31/">
    <ns:StatistikSamling>
        <ns:Statistik>
            <ns:KoeretoejIdent>9000000000442529</ns:KoeretoejIdent>
            <ns:KoeretoejArtNummer>1</ns:KoeretoejArtNummer>
            <ns:KoeretoejArtNavn>Personbil</ns:KoeretoejArtNavn>
            <ns:KoeretoejAnvendelseStruktur>
                <ns:KoeretoejAnvendelseNummer>1</ns:KoeretoejAnvendelseNummer>
                <ns:KoeretoejAnvendelseNavn>Privat personkørsel</ns:KoeretoejAnvendelseNavn>
            </ns:KoeretoejAnvendelseStruktur>
            <ns:RegistreringNummerNummer>BD85523</ns:RegistreringNummerNummer>
            <ns:KoeretoejOplysningGrundStruktur>
                <ns:KoeretoejOplysningOprettetUdFra>CocDokument</ns:KoeretoejOplysningOprettetUdFra>
                <ns:KoeretoejOplysningStatus>Registreret</ns:KoeretoejOplysningStatus>
                <ns:KoeretoejOplysningStatusDato>2017-03-15T13:27:50.000+01:00</ns:KoeretoejOplysningStatusDato>
                <ns:KoeretoejOplysningFoersteRegistreringDato>2013-07-31+02:00</ns:KoeretoejOplysningFoersteRegistreringDato>
                <ns:KoeretoejOplysningStelNummer>WF0LXXGCBLDA18320</ns:KoeretoejOplysningStelNummer>
                <ns:KoeretoejOplysningStelNummerAnbringelse>Gulvpanel ved forsæde, højre side</ns:KoeretoejOplysningStelNummerAnbringelse>
                <ns:KoeretoejOplysningModelAar>2013</ns:KoeretoejOplysningModelAar>
                <ns:KoeretoejOplysningTotalVaegt>1900</ns:KoeretoejOplysningTotalVaegt>
                <ns:KoeretoejOplysningKoereklarVaegtMinimum>1371</ns:KoeretoejOplysningKoereklarVaegtMinimum>
                <ns:KoeretoejOplysningTekniskTotalVaegt>1900</ns:KoeretoejOplysningTekniskTotalVaegt>
                <ns:KoeretoejOplysningVogntogVaegt>3100</ns:KoeretoejOplysningVogntogVaegt>
                <ns:KoeretoejOplysningAkselAntal>2</ns:KoeretoejOplysningAkselAntal>
                <ns:KoeretoejOplysningStoersteAkselTryk>1065</ns:KoeretoejOplysningStoersteAkselTryk>
                <ns:KoeretoejOplysningPassagerAntal>4</ns:KoeretoejOplysningPassagerAntal>
                <ns:KoeretoejOplysningSiddepladserMinimum>5</ns:KoeretoejOplysningSiddepladserMinimum>
                <ns:KoeretoejOplysningTilkoblingMulighed>false</ns:KoeretoejOplysningTilkoblingMulighed>
                <ns:KoeretoejOplysningTilkoblingsvaegtUdenBremser>655</ns:KoeretoejOplysningTilkoblingsvaegtUdenBremser>
                <ns:KoeretoejOplysningTilkoblingsvaegtMedBremser>1200</ns:KoeretoejOplysningTilkoblingsvaegtMedBremser>
                <ns:KoeretoejOplysningMaksimumHastighed>193</ns:KoeretoejOplysningMaksimumHastighed>
            </ns:KoeretoejOplysningGrundStruktur>
        </ns:Statistik>
    </ns:StatistikSamling>
</ns:ESStatistikListeModtag_I>

你们对我如何导入这个有什么想法吗?

用谷歌搜索了一下,但文件大小似乎确实是独一无二的,并且限制了选择。但我也是新手,因为我今天第一次安装了 SQL Server,所以我不知道我在做什么

下表如下所示:

CREATE TABLE Statistik (
    StatistikID INT PRIMARY KEY,
    KoeretoejIdent BIGINT,
    KoeretoejArtNummer INT,
    KoeretoejArtNavn VARCHAR(255),
    RegistreringNummerNummer VARCHAR(10),
    KoeretoejOplysningStatus VARCHAR(255),
    KoeretoejOplysningStatusDato DATETIME,
    KoeretoejOplysningFoersteRegistreringDato DATETIME,
    KoeretoejOplysningStelNummer VARCHAR(255),
    KoeretoejOplysningStelNummerAnbringelse VARCHAR(255),
    KoeretoejOplysningModelAar INT,
    KoeretoejOplysningTotalVaegt INT,
    KoeretoejOplysningKoereklarVaegtMinimum INT,
    KoeretoejOplysningTekniskTotalVaegt INT,
    KoeretoejOplysningVogntogVaegt INT,
    KoeretoejOplysningAkselAntal INT,
    KoeretoejOplysningStoersteAkselTryk INT,
    KoeretoejOplysningPassagerAntal INT,
    KoeretoejOplysningSiddepladserMinimum INT,
    KoeretoejOplysningTilkoblingMulighed BOOLEAN,
    KoeretoejOplysningTilkoblingsvaegtUdenBremser INT,
    KoeretoejOplysningTilkoblingsvaegtMedBremser INT,
    KoeretoejOplysningMaksimumHastighed INT,
    KoeretoejOplysningFaelgDaek TEXT,
    KoeretoejOplysningNCAPTest BOOLEAN,
    KoeretoejOplysningOevrigtUdstyr TEXT,
    KoeretoejOplysningTraekkendeAksler INT,
    KoeretoejOplysningEgnetTilTaxi BOOLEAN,
    KoeretoejOplysningAkselAfstand INT,
    KoeretoejOplysningSporviddenForrest INT,
    KoeretoejOplysningSporviddenBagest INT,
    KoeretoejOplysningTypeGodkendelseNummer VARCHAR(255),
    KoeretoejOplysningEUVariant VARCHAR(255),
    KoeretoejOplysningEUVersion VARCHAR(255),
    KoeretoejOplysningTypegodkendtKategori VARCHAR(255),
    KoeretoejOplysningAntalDoere INT,
    KoeretoejOplysningFabrikant VARCHAR(255),
    SynResultatSynsType VARCHAR(255),
    SynResultatSynsDato DATETIME,
    SynResultatSynsResultat VARCHAR(255),
    SynResultatSynStatus VARCHAR(255),
    SynResultatSynStatusDato DATETIME,
    KoeretoejMotorKilometerstand INT
);

CREATE TABLE KoeretoejAnvendelseStruktur (
    StatistikID INT,
    KoeretoejAnvendelseNummer INT,
    KoeretoejAnvendelseNavn VARCHAR(255)
);

CREATE TABLE FarveTypeStruktur (
    StatistikID INT,
    FarveTypeNummer INT,
    FarveTypeNavn VARCHAR(255)
    );
    
    -- Create additional tables for nested structures if necessary.
    
    -- Add foreign key constraints to link the tables together.
    ALTER TABLE KoeretoejAnvendelseStruktur
    ADD FOREIGN KEY (StatistikID) REFERENCES Statistik(StatistikID);
    
    ALTER TABLE FarveTypeStruktur
    ADD FOREIGN KEY (StatistikID) REFERENCES Statistik(StatistikID);
SQL-Server XML

评论

0赞 Morten Krogh 11/7/2023
文件类型: Microsoft Edge HTML 文档 (.xml) - 这就是它所说的,你知道我当时会是什么吗?
0赞 siggemannen 11/7/2023
SQL Server 的“东西”限制为 2GB。如果您在浏览器中预览文件,它可能尚未完全呈现。我建议使用流式处理库或某种方式将 xml 按位切碎,然后只插入实际数据,而不是将巨大的 xml blob 插入数据库。
0赞 Morten Krogh 11/7/2023
你能推荐一个好的流媒体库吗?
1赞 Charlieface 11/7/2023
最好的选择可能是使用 C#、Python 或 Powershell 之类的东西,使用只进读取器读取 XML,并将其分解为单独的节点,您可以将其放入适当的表中。SQL Server 无法处理如此大的 XML 文件。如果您将 XML 示例作为文本而不是图像发布,并且要插入到其中的表格,我们可以做一些事情。
2赞 Charlieface 11/7/2023
XDocument.Parse将整个东西加载到 Memroy 中,这将失败。您需要一个来读取文件。XmlReader

答:

0赞 jdweng 11/10/2023 #1

以下是 PS 脚本的一部分,用于解析 xml

using assembly System.Xml
using assembly System.Xml.Linq

$filename = 'c:\temp\test.xml'
$server = '.\sqlexpress'
$database = 'ESStatistik'
$connString = "Data Source=$server;Initial Catalog=$database;Integrated Security=True"

$reader = [System.Xml.XmlReader]::Create($filename)
$reader.MoveToContent();
$nsName = $reader.GetAttribute('xmlns:ns');
$ns = [System.Xml.Linq.XNamespace]::Get($nsName);

$id = 1

while($reader.EOF -eq $False)
{
   if ($reader.Name -ne 'Statistik')
   {
      $reader.ReadToFollowing('Statistik', $nsName)
   }
   if ($reader.EOF -eq $False)
   {
       $statistik = [System.Xml.Linq.XElement]::ReadFrom($reader)
       $KoeretoejIdent = [System.Numerics.BigInteger]::Parse($statistik.Element($ns + 'KoeretoejIdent').Value)
       $KoeretoejArtNummer = [int]::Parse($statistik.Element($ns + 'KoeretoejArtNummer').Value)
       
       $RegistreringNummerNummer = $statistik.Descendants($ns + 'KoeretoejAnvendelseNummer')[0].Value
       $KoeretoejOplysningStatus = $statistik.Descendants($ns + 'KoeretoejOplysningStatus')[0].Value

       $query = "INSERT INTO dbo.Statistik (StatistikID, KoeretoejIdent,KoeretoejArtNummer,RegistreringNummerNummer,KoeretoejOplysningStatus) VALUES ($id, $KoeretoejIdent, $KoeretoejArtNummer, $RegistreringNummerNummer,`'$KoeretoejOplysningStatus`')";
       Invoke-Sqlcmd -ConnectionString $connString -Query $query

       $id += 1
       
   }
}