[英]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_preparedocument
和sp_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.