【问题标题】:How to find the correct path for OPENXML function如何找到 OPENXML 函数的正确路径
【发布时间】:2019-11-26 07:38:40
【问题描述】:

我需要将 XML 文件中的某些字段提取到 SQL Server 表中,但我找不到在 SQL Server 的 openxml 函数中指定的正确路径。

如何输入正确的路径(从给出的 XML 提取)来提取任何此类字段?

我想用标识符中的相关数据提取 Id 和 InternalId 字段

我已经使用 openrowset 将 XML 文档引入到 SQL Server 表中。

我也有代码尝试从 XML 中提取一个字段,但我在 openxml 函数中的路径是错误的,即它一直返回一个空白。

    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\ANRE\OneDrive - Ambu\Desktop\Operation Docs\XML\SinglePortalForm.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 Id
    FROM OPENXML(@hDoc, 'Forms/PortalForm/Identifer')
    WITH 
    (
    Id [varchar](500) 'Id'

    )

    EXEC sp_xml_removedocument @hDoc
    GO


    It should be pulling Fields Id and InternalId 
    from the below: However I receive no error message, it just returns a blank


       <Identifier>
            <Id>4b68ac3d-70c7-4262-8245-c29be80f7e07</Id>
            <InternalId>17</InternalId>
            <IsReferenceValid>true</IsReferenceValid>
            <Name>ItemMarketingMakeForm</Name>
          </Identifier>



<FormFile xmlns="http//schemas.profisee.com/masterdatamaestro/2010/07" xmlnsi="http//www.w3.org/2001/XMLSchema-instance">
  <AssemblyVersion>6.1.0.0</AssemblyVersion>
  <ServerURL inil="true" />
  <UserName>UULAN\DDFV</UserName>
  <Forms xmlnsa="http//schemas.profisee.com/masterdatamaestro/2010/09">
    <PortalForm>
      <Identifier>
        <Id>4b68ac3d-70c7-4262-8245-c29be80f7e07</Id>
        <InternalId>17</InternalId>
        <IsReferenceValid>true</IsReferenceValid>
        <Name>ItemMarketingMakeForm</Name>
      </Identifier>
      <MetadataStatus>Valid</MetadataStatus>
      <UpdateState>Auto</UpdateState>
      <ChangeAudit>
        <Created>
          <DateTime>2019-05-16T071250.897</DateTime>
          <UserId>
            <Id>fe0ea488-c98f-4a4d-aff4-cd8aa3c51915</Id>
            <InternalId>18</InternalId>
            <IsReferenceValid>true</IsReferenceValid>

【问题讨论】:

    标签: xml tsql openxml


    【解决方案1】:

    这个答案比较晚,但你还没有得到任何答案......

    有几件事要知道:

    首先:FROM OPENXML(与 SP 一起准备和删除文档)已过时,不应再使用。

    第二:声明了一个默认命名空间(使用xmlns="SomeURL")。

    沿着这个尝试一些东西来获得你提到的两个领域。如果您需要其他任何内容,请返回或开始一个新问题。

    DECLARE @XML XML=
     N'<FormFile xmlns="http//schemas.profisee.com/masterdatamaestro/2010/07" xmlnsi="http//www.w3.org/2001/XMLSchema-instance">
          <AssemblyVersion>6.1.0.0</AssemblyVersion>
          <ServerURL inil="true" />
          <UserName>UULAN\DDFV</UserName>
          <Forms xmlnsa="http//schemas.profisee.com/masterdatamaestro/2010/09">
            <PortalForm>
              <Identifier>
                <Id>4b68ac3d-70c7-4262-8245-c29be80f7e07</Id>
                <InternalId>17</InternalId>
                <IsReferenceValid>true</IsReferenceValid>
                <Name>ItemMarketingMakeForm</Name>
              </Identifier>
              <MetadataStatus>Valid</MetadataStatus>
              <UpdateState>Auto</UpdateState>
              <ChangeAudit>
                <Created>
                  <DateTime>2019-05-16T071250.897</DateTime>
                  <UserId>
                    <Id>fe0ea488-c98f-4a4d-aff4-cd8aa3c51915</Id>
                    <InternalId>18</InternalId>
                    <IsReferenceValid>true</IsReferenceValid>
                  </UserId>
                </Created>
              </ChangeAudit>
            </PortalForm>
          </Forms>
        </FormFile>';
    

    --首先我们将声明命名空间,然后我们将使用.value() 从给定的 XPath 中检索一个值:

    WITH XMLNAMESPACES(DEFAULT 'http//schemas.profisee.com/masterdatamaestro/2010/07')
    SELECT @XML.value('(/FormFile/Forms/PortalForm/Identifier/Id/text())[1]','uniqueidentifier') AS Identifier_Id
          ,@XML.value('(/FormFile/Forms/PortalForm/Identifier/InternalId/text())[1]','int') AS Identifier_InternalId;
    

    --如果命名空间可能发生变化,或者&lt;Identifier&gt; 可能位于不同的位置,您可以像这里一样最小化查询

    SELECT @XML.value('(//*:Identifier/*:Id/text())[1]','uniqueidentifier') AS Identifier_Id
          ,@XML.value('(//*:Identifier/*:InternalId/text())[1]','int') AS Identifier_InternalId;
    

    推荐的方法是:“尽可能具体”。

    【讨论】:

      猜你喜欢
      • 2021-10-19
      • 2023-03-09
      • 2014-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-27
      • 2016-07-13
      相关资源
      最近更新 更多