【问题标题】:How to process a big XML File and selecting data from the same in T-SQL如何在 T-SQL 中处理大型 XML 文件并从中选择数据
【发布时间】:2019-05-06 16:13:00
【问题描述】:

我有一个具有以下结构的 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;

但是结果集只返回第一条记录。算法逻辑是将整个信息插入到表变量或临时表中,然后对每条记录进行一条一条处理。我有一些业务逻辑来实现逐条记录,我该如何选择整个记录集。

我使用 Azure SQL 作为我的服务器。

【问题讨论】:

    标签: sql-server xml tsql azure-sql-database xquery-sql


    【解决方案1】:

    假设你的 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 中选择 &lt;info&gt;-values,因为每个 XML 似乎只有一次。 &lt;data&gt; 中的值由.nodes() 选择,但比您自己尝试的要深一层(重复元素是&lt;Datum&gt;):

    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);
    

    【讨论】:

      猜你喜欢
      • 2020-11-06
      • 1970-01-01
      • 1970-01-01
      • 2020-02-05
      • 1970-01-01
      • 2011-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多