Я застрял на попытке получить значение узла «доступность» из конверта, возвращаемого через T-SQL из базы данных Microsoft Lync. Обычные методы .value ('(/ MyElement/Something) [1]'), похоже, не работают для меня.Извлечение значения дочернего узла из XML с использованием T-SQL
<state xsi:type="aggregateState" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/2006/09/sip/state">
<availability>3500
</availability>
<delimiter xmlns="http://schemas.microsoft.com/2006/09/sip/commontypes" />
<timeZoneBias>-60
</timeZoneBias>
<timeZoneName>GMT Daylight Time
</timeZoneName>
<timeZoneAbbreviation>GMT Daylight Time
</timeZoneAbbreviation>
<device>computer
</device>
<end xmlns="http://schemas.microsoft.com/2006/09/sip/commontypes" />
</state>
Это запрос, я экспериментировал с:
SELECT TOP 1
CAST(SUBSTRING(i.Data, 0, 4000) as XML).value('(/state//availability)[1]', 'varchar(256)')
FROM dbo.PublishedCategoryInstanceView AS i
INNER JOIN dbo.CategoryDef AS d
ON (d.CategoryId = i.CategoryId)
WHERE i.PublisherId = (SELECT ResourceId FROM dbo.Resource
WHERE UserAtHost = '[email protected]')
ORDER BY i.LastPubTime DESC
Все, что я вернусь в «NULL», если я не делаю CAST(SUBSTRING(i.Data, 0, 4000) as XML).value('(/)[1]', 'varchar(256)')
, который возвращает 3500-60GMT Daylight TimeGMT Daylight Timecomputer
Я знаю, что когда я вычеркнуть три атрибута элемента состояния, я могу выполнять обычные XML-запросы против данных, поэтому я могу обойти это, манипулируя строкой несколькими операциями замены, но я бы лучше узнал, что я делаю неправильно здесь, если кто-то может помочь?
Большое спасибо! –