2015-01-20 2 views
0

У меня возникли некоторые трудности при анализе XML-кода в формате таблицы, который мне нужен. Ниже приведен пример XML-я будет получатьАнализ синтаксического анализа XML с помощью SQL Server TSQL

<p>8abbdcf1-eff2-4b26-b905-343298338954</p> 
<d> 
    <id>172fcf08-79d6-467a-a40e-362583683680</id> 
    <id>2149987c-1311-4ad0-b8bb-362477435274</id> 
</d> 

Там всегда будет один элемент, в «р» и может быть любое количество идентификаторов в «D».

Я хочу, чтобы результаты применяли «p» к каждому id в «d». Я осмотрелся и попытался понять, как работает синтаксический анализ xml, но у него были некоторые трудности. Мои результаты, как правило, либо 1 запись с одним ID, либо 2 записи (количество элементов в «d»), но возвращаемое значение равно null. Поскольку мне еще не удалось получить список идентификаторов, я не перешел к применению P к этому.

Ниже мое самое последнее усилие:

SET @InputXML = 
    ' 
    <p>8abbdcf1-eff2-4b26-b905-343298338954</p> 
    <d> 
     <id>172fcf08-79d6-467a-a40e-362583683680</id> 
     <id>2149987c-1311-4ad0-b8bb-362477435274</id> 
    </d> 
    ' 
SELECT list.d.value('id[1]','nvarchar(100)') AS ID 
FROM @InputXML.nodes('/d') AS list(d) 

Надеялся на результат будет:

p          |ID 
8abbdcf1-eff2-4b26-b905-343298338954 |172fcf08-79d6-467a-a40e-362583683680 
8abbdcf1-eff2-4b26-b905-343298338954 |2149987c-1311-4ad0-b8bb-362477435274 
+0

вы можете изменить вопрос с ожидаемым результатом в виде таблицы –

+0

вы рассмотреть не разобрать XML с TSQL? это будет проще, если вы будете работать с серверными языками, такими как JSP, ASP.NET или PHP. – Raptor

+0

Я добавил ожидаемый результат. – Andrew

ответ

1

Вам нужно добавить /id к вашей функции узлов для того, чтобы получить новую строку для каждого идентификатора , то вы можете использовать .value('.','nvarchar(100)'), чтобы получить внутренний текст каждого узла id. Это, кажется, работает, как ожидалось:

DECLARE @InputXML XML = 
    '<p>8abbdcf1-eff2-4b26-b905-343298338954</p> 
    <d> 
     <id>172fcf08-79d6-467a-a40e-362583683680</id> 
     <id>2149987c-1311-4ad0-b8bb-362477435274</id> 
    </d>'; 

SELECT p = @InputXML.value('p[1]', 'nvarchar(100)'), 
     id = list.d.value('.','nvarchar(100)') 
FROM @InputXML.nodes('d/id') AS list(d); 
+0

Привет, Гарет, это работает, спасибо вам большое. Я имел/id в функции узлов в одной точке, но в этой точке я возвращал нули для каждой строки. это было '.' часть, о которой я не знал. Еще раз спасибо – Andrew

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