Импорт данных из 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 |
+--------------+-------------+------------+------------+
