提问人:Morten Krogh 提问时间:11/7/2023 最后编辑:Morten Krogh 更新时间:11/11/2023 访问量:142
100 GB XML 到 SQL Server 数据库中
100 GB XML into SQL Server database
问:
我遇到了问题,既因为我不知道自己在做什么,还因为我的数据文件太大了。
TLDR:我已经下载了 SQL Server 2022 和 SQL Server Management Studio,需要将我的大文件导入到表中。
我有这个大约 100 GB 的 XML,其中包含来自丹麦的整个车辆注册表。我需要将其导入到表中,这样我就可以进行查找,没有什么比这更奇特的了。但我似乎不知道如何导入它。由于它的大小,我无法在 Microsoft Edge 以外的任何地方打开该文件。
这也让我感到困惑,我应该如何阅读我的文件,它没有根目录和东西,只有纯文本。
下面是 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);
答:
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
}
}
评论
XDocument.Parse
将整个东西加载到 Memroy 中,这将失败。您需要一个来读取文件。XmlReader