2016-03-31 3 views
2

Я пытаюсь сгладить данные XML в SQL-запросе, но я всегда получаю null.Сглаживание данных xml в sql

Я попробовал крест/внешний применяемый метод, описанный here.

Столбец с данными XML называется Data.

Я предполагаю, что данные xml с этими ссылками также должны быть добавлены?

Не могли бы вы помочь получить правильный SQL-запрос?

Query Я попытался:

SELECT 
v.name 
,pref.value('(LocalId/text())[1]', 'nvarchar(10)') as localid 
FROM [database].[requests] v 
outer apply v.Data.nodes('/DataForm') x(pref) 
GO 

пример данных XML в этом столбце:

<Dataform xmlns="http://somelongasslink.org/hasalsosomestuffhere" xmlns:i="http://somexlmschemalink/"> 
    <DeleteDate xmlns="http://somelongasslink.org/hasalsosomestuffhere" i:nil="true" /> 
    <LocalId xmlns="http://somelongasslink.org/hasalsosomestuffhere">5325325</LocalId> 
    ... 

ответ

2

Вы можете использовать этот код, чтобы получить результат, который вы ищете:

;WITH XMLNAMESPACES(DEFAULT 'http://somelongasslink.org/hasalsosomestuffhere') 
SELECT 
    rq.Name, 
    LocalID = TC.value('(LocalId)[1]', 'nvarchar(10)') 
FROM 
    [database].[requests] rq 
CROSS APPLY 
    rq.Data.nodes('/Dataform') AS TX(TC) 
GO 

С кодом были проблемы 2:

  1. вы не уважая/включая пространство именXML, который определен в документе XML

    <Dataform xmlns="http://somelongasslink.org/hasalsosomestuffhere" 
          ******************************************************* 
    
  2. вы не обратили внимание на чувствительность к регистру из XML в вашем вызове .nodes() - вам нужно использовать .nodes('/Dataform') (не /DataForm - Fэто не капитализируются в вашем XML)

+1

Возможно, вам также потребуется определить пространство имен «xmlns: i», если вы явно хотите прочитать атрибут «i: nil» ... Upvote from my side – Shnugo

+0

Как бороться с несколькими пространствами имен? Код, который вы предоставили, работает (спасибо за это), но для других атрибутов без пространств имен. Мой пример xml немного неверен для моего случая, поскольку пространство имен ссылок в localid отличается от формы данных. – Exanimis

+0

@Exanimis: вам нужно использовать 'WITH XMLNAMESPACES ('.....' AS ns1, '.......' AS ns2)', а затем использовать те префиксы, определенные в выражениях XPath, –

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