2013-09-11 5 views
3

Я застрял на попытке получить значение узла «доступность» из конверта, возвращаемого через 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-запросы против данных, поэтому я могу обойти это, манипулируя строкой несколькими операциями замены, но я бы лучше узнал, что я делаю неправильно здесь, если кто-то может помочь?

ответ

3

Вы просто игнорируя пространство имен XML, который существует на корневом узле XML:

<state xsi:type="aggregateState" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns="http://schemas.microsoft.com/2006/09/sip/state"> 
     ******************************************************  

Вам нужно включить, что в вашем T-SQL запрос!

попробовать что-то вроде этого:

;WITH XMLNAMESPACES(DEFAULT 'http://schemas.microsoft.com/2006/09/sip/state') 
SELECT TOP 1 
    CAST(SUBSTRING(i.Data, 0, 4000) as XML).value('(/state//availability)[1]', 'varchar(256)') 
FROM 
    dbo.PublishedCategoryInstanceView AS i 
+0

Большое спасибо! –

Смежные вопросы