如何在 T-SQL 中处理大 XML 文件并从中选择数据
How to process a big XML File and selecting data from the same in T-SQL
我有一个具有以下结构的 XML 参数
<?xml version="1.0" encoding="utf-16"?>
<ContactsGET xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<data>
<Datum>
<Owner>
<name>dilip.nair</name>
<id>3565223000000178021</id>
</Owner>
<Email xsi:type="xsd:string">mail2vembu@mail.com</Email>
<Full_Name>Sridhar Vembu</Full_Name>
<name>Abcon Group</name>
<id>3565223000000206007</id>
</Datum>
<Datum>
<Owner>
<name>dilip.nair</name>
<id>3565223000000178021</id>
</Owner>
<Email xsi:type="xsd:string">mail2vembu@mail.com</Email>
<Full_Name>Sridhar Vembu</Full_Name>
<name>Abcon Group</name>
<id>3565223000000206007</id>
</Datum>
</data>
<info>
<per_page>200</per_page>
<count>200</count>
<page>1</page>
<more_records>true</more_records>
</info>
</ContactsGET>
在 T-SQL 中,我试图处理 XML 中 Datum 的 标签下的每条记录。
SELECT
[TABLE].[ROW].value('Datum[1]','VARCHAR(4000)')
FROM
@pXMLGetContact.nodes('ContactsGET/data') AS [TABLE]([ROW])
SELECT @pXMLGetContact;
但是结果集returns只有第一条记录。算法逻辑是将整个信息插入到一个table变量或临时table中,然后一条一条地处理每条记录。我有一些业务逻辑来逐条记录地实现,我如何 select 作为一个完整的记录集。
我正在使用 Azure SQL 作为我的服务器。
假设您的 XML 生活在一个 XML 类型的变量中,您可以试试这个:
DECLARE @xml XML=
N'<ContactsGET xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<data>
<Datum>
<Owner>
<name>dilip.nair</name>
<id>3565223000000178021</id>
</Owner>
<Email xsi:type="xsd:string">mail2vembu@mail.com</Email>
<Full_Name>Sridhar Vembu</Full_Name>
<name>Abcon Group</name>
<id>3565223000000206007</id>
</Datum>
<Datum>
<Owner>
<name>dilip.nair</name>
<id>3565223000000178021</id>
</Owner>
<Email xsi:type="xsd:string">mail2vembu@mail.com</Email>
<Full_Name>Sridhar Vembu</Full_Name>
<name>Abcon Group</name>
<id>3565223000000206007</id>
</Datum>
</data>
<info>
<per_page>200</per_page>
<count>200</count>
<page>1</page>
<more_records>true</more_records>
</info>
</ContactsGET>'
--查询将直接从 XML 中选取 <info>
值,因为似乎每个 XML 一次。 <data>
中的值由 .nodes()
选取,但比您自己尝试的更深一层(重复元素是 <Datum>
):
SELECT @xml.value('(/ContactsGET/info/per_page/text())[1]','int') Info_PerPage
,@xml.value('(/ContactsGET/info/count/text())[1]','int') Info_Count
,@xml.value('(/ContactsGET/info/page/text())[1]','int') Info_Page
,@xml.value('(/ContactsGET/info/more_records/text())[1]','bit') Info_MoreRecords
,dat.value('(Owner/name/text())[1]','nvarchar(max)') Owner_name
,dat.value('(Owner/id/text())[1]','nvarchar(max)') Owner_id
,dat.value('(Email/text())[1]','nvarchar(max)') eMail
,dat.value('(Full_Name/text())[1]','nvarchar(max)') Full_Name
,dat.value('(name/text())[1]','nvarchar(max)') [Name]
,dat.value('(id/text())[1]','nvarchar(max)') id
FROM @xml.nodes('/ContactsGET/data/Datum') A(dat);
我有一个具有以下结构的 XML 参数
<?xml version="1.0" encoding="utf-16"?>
<ContactsGET xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<data>
<Datum>
<Owner>
<name>dilip.nair</name>
<id>3565223000000178021</id>
</Owner>
<Email xsi:type="xsd:string">mail2vembu@mail.com</Email>
<Full_Name>Sridhar Vembu</Full_Name>
<name>Abcon Group</name>
<id>3565223000000206007</id>
</Datum>
<Datum>
<Owner>
<name>dilip.nair</name>
<id>3565223000000178021</id>
</Owner>
<Email xsi:type="xsd:string">mail2vembu@mail.com</Email>
<Full_Name>Sridhar Vembu</Full_Name>
<name>Abcon Group</name>
<id>3565223000000206007</id>
</Datum>
</data>
<info>
<per_page>200</per_page>
<count>200</count>
<page>1</page>
<more_records>true</more_records>
</info>
</ContactsGET>
在 T-SQL 中,我试图处理 XML 中 Datum 的 标签下的每条记录。
SELECT
[TABLE].[ROW].value('Datum[1]','VARCHAR(4000)')
FROM
@pXMLGetContact.nodes('ContactsGET/data') AS [TABLE]([ROW])
SELECT @pXMLGetContact;
但是结果集returns只有第一条记录。算法逻辑是将整个信息插入到一个table变量或临时table中,然后一条一条地处理每条记录。我有一些业务逻辑来逐条记录地实现,我如何 select 作为一个完整的记录集。
我正在使用 Azure SQL 作为我的服务器。
假设您的 XML 生活在一个 XML 类型的变量中,您可以试试这个:
DECLARE @xml XML=
N'<ContactsGET xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<data>
<Datum>
<Owner>
<name>dilip.nair</name>
<id>3565223000000178021</id>
</Owner>
<Email xsi:type="xsd:string">mail2vembu@mail.com</Email>
<Full_Name>Sridhar Vembu</Full_Name>
<name>Abcon Group</name>
<id>3565223000000206007</id>
</Datum>
<Datum>
<Owner>
<name>dilip.nair</name>
<id>3565223000000178021</id>
</Owner>
<Email xsi:type="xsd:string">mail2vembu@mail.com</Email>
<Full_Name>Sridhar Vembu</Full_Name>
<name>Abcon Group</name>
<id>3565223000000206007</id>
</Datum>
</data>
<info>
<per_page>200</per_page>
<count>200</count>
<page>1</page>
<more_records>true</more_records>
</info>
</ContactsGET>'
--查询将直接从 XML 中选取 <info>
值,因为似乎每个 XML 一次。 <data>
中的值由 .nodes()
选取,但比您自己尝试的更深一层(重复元素是 <Datum>
):
SELECT @xml.value('(/ContactsGET/info/per_page/text())[1]','int') Info_PerPage
,@xml.value('(/ContactsGET/info/count/text())[1]','int') Info_Count
,@xml.value('(/ContactsGET/info/page/text())[1]','int') Info_Page
,@xml.value('(/ContactsGET/info/more_records/text())[1]','bit') Info_MoreRecords
,dat.value('(Owner/name/text())[1]','nvarchar(max)') Owner_name
,dat.value('(Owner/id/text())[1]','nvarchar(max)') Owner_id
,dat.value('(Email/text())[1]','nvarchar(max)') eMail
,dat.value('(Full_Name/text())[1]','nvarchar(max)') Full_Name
,dat.value('(name/text())[1]','nvarchar(max)') [Name]
,dat.value('(id/text())[1]','nvarchar(max)') id
FROM @xml.nodes('/ContactsGET/data/Datum') A(dat);