【问题标题】:Querying attributes from a XML column从 XML 列中查询属性
【发布时间】:2019-04-18 21:02:24
【问题描述】:

我需要从SPEC 列中的所有Output\OutputFields\OutputField 中获取名称字段的值。

create table T
( 
     ID uniqueidentifier default newid(), 
     SPEC xml
);

insert into T (SPEC)
values (N'<QueryViewSpec xmlns="bb_appfx_queryview" xmlns:common="bb_appfx_commontypes">
<Output>
<OutputFields>
  <OutputField Caption="Key name prefix" Name="KEYNAMEPREFIX" CaptionResourceKey="$$key_name_prefix" />
  <OutputField Caption="Number of employees" Name="NUMEMPLOYEES" CaptionResourceKey="$$number_of_employees" />
  <OutputField Caption="Number of subsidiaries" Name="NUMSUBSIDIARIES" CaptionResourceKey="$$number_of_subsidiaries" />
  <OutputField Caption="Parent corporation ID" IsHidden="true" Name="PARENTCORPID" />
  <OutputField Caption="Is organization" Name="ISORGANIZATION" CaptionResourceKey="$$is_organization" />
  <OutputField Caption="Last/Organization/Group/Household name" Name="KEYNAME" CaptionResourceKey="$$last/organization/group/household_name" />
  <OutputField Caption="First name" Name="FIRSTNAME" CaptionResourceKey="$$first_name" />
  <OutputField Caption="Middle name" Name="MIDDLENAME" CaptionResourceKey="$$middle_name" />
  <OutputField Caption="Maiden name" Name="MAIDENNAME" CaptionResourceKey="$$maiden_name" />
  <OutputField Caption="Nickname" Name="NICKNAME" CaptionResourceKey="$$nickname" />
  <OutputField Caption="Lookup ID" Name="LOOKUPID" CaptionResourceKey="$$lookup_id" />
</OutputFields>
</Output>
</QueryViewSpec>')

select * from T

;with xmlnamespaces ('bb_appfx_queryview' as ns)
select
    R.c.value('@Name', 'varchar(max)')
from
    T
    outer apply 
    SPEC.nodes('ns:QueryViewSpec/Output/OutputFields/OutputField') as R(c)

drop table T;

我错过了什么?我尝试过使用和不使用命名空间,但都没有运气。

【问题讨论】:

    标签: sql-server xml tsql


    【解决方案1】:

    您需要通过指定名称空间前缀ns:(我也使用CROSS APPLY)将您定义的XML名称空间应用到您的XPath表达式 - 试试这个:

    ;WITH xmlnamespaces ('bb_appfx_queryview' AS ns)
    SELECT
        R.c.value('@Name', 'VARCHAR(MAX)')
    FROM
        T
    CROSS APPLY
        SPEC.nodes('/ns:QueryViewSpec/ns:Output/ns:OutputFields/ns:OutputField') as R(c)
    

    或者 - 或者 - 您需要将 XML 命名空间定义为 default 命名空间 - 像这样:

    ;WITH xmlnamespaces (DEFAULT 'bb_appfx_queryview')
    SELECT
        R.c.value('@Name', 'VARCHAR(MAX)')
    FROM
        T
    CROSS APPLY
        SPEC.nodes('/QueryViewSpec/Output/OutputFields/OutputField') as R(c)
    

    【讨论】:

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