【问题标题】:SQL Server : parse XML in field with unknown namespaceSQL Server:解析具有未知命名空间的字段中的 XML
【发布时间】:2019-03-15 17:04:36
【问题描述】:

我正在尝试从列中解析 XML 以将其添加到报告视图中,但我不知道名称空间。它可能更复杂,因为 XML 中的字段仅在基础应用程序中使用该字段时才创建。 我试图从 Custom# 列解析 XML 的 pfm.Entity 表由以下列构成:

[RootId#] ,[Id#] ,[LastId#] ,[Guid#] ,[Custom#] ,[Type#]

我的目标是将 Custom# 中包含的 XML 解析为列,以便我可以在 RootId# 字段中将表与其他人连接起来。下面是我正在测试的选择语句:

WITH XMLNAMESPACES ('http://www.w3.org/2001/XMLSchema' as ns)  
    SELECT TOP (1000)
        Custom#.value('(/ns:Fields/ns:Field)[1]', 'VARCHAR(50)') AS xmlfield
    FROM 
        [SelectDb].[pfm].[Entity]

我的猜测是,我需要使用以下内容进行选择,但这会在 # 字符上引发错误。

SELECT 
    Custom#.value('(/ns:Fields/ns:MarketingSrcPercentage_901419#)[1]', 'VARCHAR(50)') AS mktsrcp

以下是字段中 XML 的两个示例。请记住,在某些行中 this 也为 NULL。

<Fields>
  <Field name="PurchaseDate_NJ#">6/11/2018</Field>
  <Field name="AddOrImpDate_NJ#">8/1/2018</Field>
  <Field name="AffidavitAddOrExcep_NJ#">nfui fevtt[th40thijfkrkl grwgr ijg rgmrk gmkmr pkgi</Field>
  <Field name="DateOfPropertyAcquisition_DC#">8/7/2018</Field>
  <Field name="AuthorizedAppointedAgent_PA#">NAME OF PERSON AUTHORIZED/APPONTED AGENT PROMPT BOX</Field>
  <Field name="SpouseWaivingMaritalRights_PA#">NAME OF SPOUSE WAIVING MARTIAL RIGHTS PROMPT BOX</Field>
  <Field name="PersonalFunds_TXFA#">true</Field>
  <Field name="Currency_TXFA#">true</Field>
  <Field name="CashiersCheck_TXFA#">true</Field>
  <Field name="TravelersCheck_TXFA#">true</Field>
  <Field name="MoneyOrder_TXFA#">true</Field>
  <Field name="BusinessCheck_TXFA#">true</Field>
  <Field name="PersonalCheck_TXFA#">true</Field>
  <Field name="BankruptcyFilings_NY#">true</Field>
</Fields>

<Fields>
  <Field name="">1</Field>
  <Field name="MarketingSrcPercentage_901419#">1</Field>
  <Field name="MarketingRep1Name_901419#">Brian</Field>
</Fields>

如果有帮助,这是 SoftPro Select 的数据库。我查看了他们的文档,但没有找到任何帮助。

编辑:添加了更清晰的源表定义。

【问题讨论】:

    标签: sql-server xml


    【解决方案1】:

    您提供的 XML 不包含任何命名空间?我不知道,为什么你认为你需要WITH XMLNAMESPACES...

    试试这个:

    DECLARE @xml XML=
    N'<Fields>
      <Field name="PurchaseDate_NJ#">6/11/2018</Field>
      <Field name="AddOrImpDate_NJ#">8/1/2018</Field>
      <Field name="AffidavitAddOrExcep_NJ#">nfui fevtt[th40thijfkrkl grwgr ijg rgmrk gmkmr pkgi</Field>
      <Field name="DateOfPropertyAcquisition_DC#">8/7/2018</Field>
      <Field name="AuthorizedAppointedAgent_PA#">NAME OF PERSON AUTHORIZED/APPONTED AGENT PROMPT BOX</Field>
      <Field name="SpouseWaivingMaritalRights_PA#">NAME OF SPOUSE WAIVING MARTIAL RIGHTS PROMPT BOX</Field>
      <Field name="PersonalFunds_TXFA#">true</Field>
      <Field name="Currency_TXFA#">true</Field>
      <Field name="CashiersCheck_TXFA#">true</Field>
      <Field name="TravelersCheck_TXFA#">true</Field>
      <Field name="MoneyOrder_TXFA#">true</Field>
      <Field name="BusinessCheck_TXFA#">true</Field>
      <Field name="PersonalCheck_TXFA#">true</Field>
      <Field name="BankruptcyFilings_NY#">true</Field>
    </Fields>';
    

    --只是一些示例,以类型安全的方式获取命名值。
    --其他的都一样...

    SELECT @xml.value('(/Fields/Field[@name="PurchaseDate_NJ#"])[1]','date') AS [PurchaseDate_NJ#]
          ,@xml.value('(/Fields/Field[@name="AuthorizedAppointedAgent_PA#"])[1]','nvarchar(max)') AS [AuthorizedAppointedAgent_PA#]
          ,@xml.value('(/Fields/Field[@name="Currency_TXFA#"])[1]','bit') AS [Currency_TXFA#]
    

    【讨论】:

    • 感谢您的回复,但我不清楚。 XML 已在表名称 pfm.Entity 中名为 Custom# 的列中定义,并由应用程序放置在那里。该表具有以下列: [RootId#] ,[Id#] ,[LastId#] ,[Guid#] ,[Custom#] ,[Type#]
    • @user11209799 使用您的列名而不是@xml 就足够了。你试过了吗?
    【解决方案2】:

    我找到了解决该问题的方法,但不是提取所有字段并将它们分类为列的理想解决方案。我仍在寻找命名空间,但以下内容目前正在工作。

    SELECT TOP (1000)
        entity.Custom#.value('data(//Field[@name="MarketingRep1Name_901419#"])[1]','VARCHAR(100)') 'MarketingRep1'
    FROM 
        [SelectDb].[pfm].[Entity] entity
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-14
      • 1970-01-01
      • 1970-01-01
      • 2014-05-14
      相关资源
      最近更新 更多