簡體   English   中英

將這個非常大的 xml 文件導入 SQL 服務器數據庫的最佳方法是什么

[英]What is the best way to import this very large xml file into a SQL Server database

我有一個 XML 文件,其中包含 95 gb 數據(1444 mio 行)。 我需要將一些數據導入到 SQL 服務器表中。

我制作了一個示例文件,我嘗試使用以下代碼將其導入我的 SQL 服務器。 我沒有得到任何錯誤,但我也沒有得到表中的任何數據。

示例文件: https://1drv.ms/u/s?AnJeuk8W8KbEjblueb6bjKaDWJ5XAw?e=2molDZ

CREATE DATABASE DMR_DB2
GO

USE DMR_DB2
GO

CREATE TABLE XMLwithOpenXML
(
    Id INT IDENTITY PRIMARY KEY,
    XMLData XML,
    LoadedDateTime DATETIME
)

INSERT INTO XMLwithOpenXML(XMLData, LoadedDateTime)
    SELECT CONVERT(XML, BulkColumn) AS BulkColumn, GETDATE() 
    FROM OPENROWSET(BULK 'C:\Users\kn\Desktop\ESStatistikListeModtag-20220911-222128\Test.xml', SINGLE_BLOB) AS x;

--SELECT * FROM XMLwithOpenXML


DECLARE @XML AS XML, @hDoc AS INT, @SQL NVARCHAR (MAX)

SELECT @XML = XMLData FROM XMLwithOpenXML

EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML

SELECT KoeretoejIdent, KoeretoejArtNummer, KoeretoejArtNavn
FROM OPENXML(@hDoc, 'ESStatistikListeModtag_I/StatistikSamling/Statistik')
WITH 
(
KoeretoejIdent [varchar](50) '@KoeretoejIdent',
KoeretoejArtNummer [varchar](100) '@KoeretoejArtNummer',
KoeretoejArtNavn [varchar](100) 'KoeretoejArtNavn'
)

EXEC sp_xml_removedocument @hDoc
GO

請嘗試以下解決方案。

它適用於您的小型 XML 樣品。

保留 Microsoft 專有的OPENXML()及其伙伴sp_xml_preparedocumentsp_xml_removedocument只是為了與過時的 SQL Server 2000 向后兼容。它們的使用減少到很少的邊緣情況。 從 SQL Server 2005 開始,強烈建議重新編寫您的 SQL 並將其切換到 XQuery。

正如@Lamu 已經指出的那樣,SQL 服務器 XML 類型的列最多可以容納 2 GB XML。

對於 95 GB,您需要使用 SSQL Server Integration Services (SSIS)。

SSIS 對 XML 文件大小沒有限制。 它將處理操作系統 (OS) 文件系統允許的任何內容。

SQL

USE tempdb;
GO

DROP TABLE IF EXISTS dbo.tbl;

CREATE TABLE tbl (
    ID INT IDENTITY(1, 1) PRIMARY KEY,
    XmlColumn XML
);

INSERT INTO tbl(XmlColumn)
SELECT * FROM OPENROWSET(BULK N'c:\Downloads\Test.xml', SINGLE_BLOB) AS x;

WITH XMLNAMESPACES(DEFAULT 'http://skat.dk/dmr/2007/05/31/')
SELECT c.value('(KoeretoejIdent/text())[1]', 'VARCHAR(50)') as KoeretoejIdent
    , c.value('(KoeretoejArtNummer/text())[1]', 'INT') as KoeretoejArtNummer
    , c.value('(KoeretoejArtNavn/text())[1]', 'NVARCHAR(50)') as KoeretoejArtNavn
FROM tbl
   CROSS APPLY XmlColumn.nodes('/ESStatistikListeModtag_I/StatistikSamling/Statistik') AS t(c);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM