Запрос атрибутов из столбца XML - PullRequest
1 голос
/ 19 апреля 2019

Мне нужно получить значение поля Имя из всех Output\OutputFields\OutputField в столбце SPEC.

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;

Чего мне не хватает? Я пробовал с и без пространств имен без удачи.

1 Ответ

0 голосов
/ 19 апреля 2019

Вам необходимо применить пространство имен XML, которое вы определили к своему выражению XPath, указав префикс пространства имен ns: (и я бы также использовал CROSS APPLY) - попробуйте это:

;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 как пространство имен по умолчанию - например, так:

;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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...