SQL Server XQuery с пространством имен по умолчанию



У меня есть некоторые XML-данные в таблице SQL Server в столбце XML следующим образом:



<AffordabilityResults>
<matchlevel xmlns="urn:callcredit.co.uk/soap:affordabilityapi2">IndividualMatch</matchlevel>
<searchdate xmlns="urn:callcredit.co.uk/soap:affordabilityapi2">2013-07-29T11:20:53</searchdate>
<searchid xmlns="urn:callcredit.co.uk/soap:affordabilityapi2">{E40603B5-B59C-4A6A-92AB-98DE83DB46E7}</searchid>
<calculatedgrossannual xmlns="urn:callcredit.co.uk/soap:affordabilityapi2">13503</calculatedgrossannual>
<debtstress xmlns="urn:callcredit.co.uk/soap:affordabilityapi2">
<incomedebtratio>
<totpaynetincome>0.02</totpaynetincome>
<totamtunsecured>0.53</totamtunsecured>
<totamtincsec>0.53</totamtincsec>
</incomedebtratio>
</debtstress>
</AffordabilityResults>


Вы заметите, что некоторые элементы имеют атрибут xmlns, а некоторые-нет...



Мне нужно написать запросы, чтобы вернуть данные , и, что еще важнее, показать бизнес-аналитику, как писать свои собственные запросы, чтобы получить необходимые данные, поэтому я хочу, чтобы это было как можно проще.



Я могу легко запросить данные, используя элемент WITH XMLNAMESPACES следующим образом:



WITH XMLNAMESPACES (N'urn:callcredit.co.uk/soap:affordabilityapi2' as x )
SELECT

ResponseXDoc.value('(/AffordabilityResults/x:matchlevel)[1]','varchar(max)' ) AS MatchLevel
, ResponseXDoc.value('(/AffordabilityResults/x:debtstress/x:incomedebtratio/x:totamtunsecured)[1]','nvarchar(max)' ) AS UnsecuredDebt

FROM [NewBusiness].[dbo].[t_TacResults]


Но добавление x: часть запроса делает его слишком сложным, и я хочу, чтобы он был простым для бизнес-аналитика.



Я попытался добавить:



WITH XMLNAMESPACES (DEFAULT 'urn:callcredit.co.uk/soap:affordabilityapi2' )


И удаление x: из XQuery - но это возвращает null (возможно, из-за отсутствия xmlns в корневом элементе?)



Можно ли как-то упростить эти запросы, используя или не используя пространство имен по умолчанию?

513   1  

1 ответ:

Если пространства имен не важны в вашем случае использования, вы можете использовать селектор подстановочных знаков пространства имен *:, который выбирает узлы без и с произвольными пространствами имен.

Примером запроса может быть

(/*:AffordabilityResults/*:matchlevel)[1]
Бизнес-аналитику все равно придется добавлять селектор перед каждым тестом узла, но это один и тот же "префикс" все время, и единственная ошибка, которую можно ожидать, - это забыть его где-то использовать.

Comments

    Ничего не найдено.