Импорт данных из XML в SQL

Пытаюсь импортировать данные из таблицы XML файла в таблицу на сервере MSSQL.

В чём ошибка?

XML:

<?xml version="1.0" encoding="UTF-8"?>
-<RISKS xmlns="uPVV:v0.0.6">
<UniqueIdentifier>C_20220530_1.xml</UniqueIdentifier>
<Risks_Report_Date>2022-05-31</Risks_Report_Date>
-<RISK>
<inn>0100000011</inn>
<client_type>ЮЛ</client_type>
<risk_level>1</risk_level>
<risk_date>2022-04-06</risk_date>
</RISK>
-<RISK>
<inn>0100001390</inn>
<client_type>ЮЛ</client_type>
<risk_level>1</risk_level>
<risk_date>2022-05-30</risk_date>
</RISK>
-<RISK>
<inn>0101003657</inn>
<client_type>ЮЛ</client_type>
<risk_level>1</risk_level>
<risk_date>2022-05-30</risk_date>
</RISK>
-<RISK>
<inn>010103442039</inn>
<client_type>ИП</client_type>
<risk_level>1</risk_level>
<risk_date>2022-05-30</risk_date>
</RISK>
-<RISK>
<inn>010705327555</inn>
<client_type>ИП</client_type>
<risk_level>2</risk_level>
<MainRisk>9.01</MainRisk>
<risk_date>2022-05-04</risk_date>
</RISK>

Код:

USE [Stage]
GO

INSERT INTO [dbo].[base_kyc_cb_20220530]
           ([inn]
           ,[client_type]
           ,[risk_level]
           ,[risk_date]
           ,[MainRisk]
           ,[AddRisk1]
           ,[AddRisk2]
           ,[AddRisk3])
SELECT [inn]
           ,[client_type]
           ,[risk_level]
           ,[risk_date]
           ,[MainRisk]
           ,[AddRisk1]
           ,[AddRisk2]
           ,[AddRisk3] FROM OPENROWSET(  
   BULK 'h:\mssql\Сhh_0706.xml',  
   SINGLE_BLOB) AS x; 
GO

Create:

 [inn] VARCHAR(12)
,[client_type] VARCHAR(12)
,[risk_level] int
,[risk_date] date
,[MainRisk] float
,[AddRisk1] float
,[AddRisk2] float
,[AddRisk3] float

ОШИБКА


Ответы (1 шт):

Автор решения: Yitzhak Khabinsky

Вот как это сделать.

XML имеет пространство имен по умолчанию. Поэтому нам нужно позаботиться об этом.

Остальное легко сделать с помощью методов XQuery .nodes() и .value(). То, что мы делаем, называется XML shredding.

SQL

DECLARE @tbl TABLE
(
    inn VARCHAR(12),
    client_type NVARCHAR(12),
    risk_level INT,
    risk_date DATE
);

;WITH XMLNAMESPACES(DEFAULT 'uPVV:v0.0.6')
    , rs (xmlData) AS
(
   SELECT TRY_CAST(BulkColumn AS XML) 
   FROM OPENROWSET(BULK N'e:\Temp\input.xml', SINGLE_BLOB) AS x
)
INSERT INTO @tbl (inn, client_type, risk_level, risk_date)
SELECT c.value('(inn/text())[1]', 'VARCHAR(12)') AS inn
   , c.value('(client_type/text())[1]', 'NVARCHAR(12)') AS client_type
   , c.value('(risk_level/text())[1]', 'INT') AS risk_level
   , c.value('(risk_date/text())[1]', 'DATE') AS risk_date
FROM rs 
   CROSS APPLY xmlData.nodes('/RISKS/RISK') AS t(c);

-- test
SELECT * FROM @tbl;

Результат

+--------------+-------------+------------+------------+
|     inn      | client_type | risk_level | risk_date  |
+--------------+-------------+------------+------------+
|   0100000011 | ЮЛ          |          1 | 2022-04-06 |
|   0100001390 | ЮЛ          |          1 | 2022-05-30 |
|   0101003657 | ЮЛ          |          1 | 2022-05-30 |
| 010103442039 | ИП          |          1 | 2022-05-30 |
| 010705327555 | ИП          |          2 | 2022-05-04 |
+--------------+-------------+------------+------------+
→ Ссылка