Получить значения из столбца XML - PullRequest
4 голосов
/ 05 марта 2012

У меня есть столбец XML с этим значением

<sso_links>
   <linktype>mytype</linktype>
   <url>http://mydomain.com</url>
   <linktype>mytype2</linktype>
   <url>http://somedomain.com</url>
</sso_links>

Я пытался использовать SQL для запроса этого значения, но это возвращает только скалярный тип

SELECT XMLCOLUMN.value('//linktype[1]', varchar(max)),
XMLCOLUMN.value('//url[1]', varchar(max))
from table
where someid = '1'

Это привело к 2 строкамиз XML.Как я могу вывести все значения?

Ответы [ 2 ]

1 голос
/ 05 марта 2012

Если вам нужна «универсальная» версия, которая будет анализировать все подузлы в <sso_links> и выдает их имя и значение, используйте что-то вроде этого:

SELECT 
    NodeName = node.value('local-name(.)', 'varchar(100)'),
    NodeValue = node.value('(.)[1]', 'varchar(200)')
FROM
    dbo.YourTable
CROSS APPLY 
    XmlColumn.nodes('/sso_links/*') AS links(node)
WHERE 
    SomeID = 1

Для вашего примера XML я получаю вывод:

NodeName    NodeValue
linktype    mytype
url         http://mydomain.com
linktype    mytype2
url         http://somedomain.com

Поскольку он не использует конкретных имен узлов или индексов, это будет работать для любого количества подузлов в <sso_links>

1 голос
/ 05 марта 2012

Создать таблицу

CREATE TABLE docs (pk INT PRIMARY KEY, xCol XML not null)

Вставить значения

INSERT INTO docs VALUES (1, '<sso_links>
<linktype>mytype</linktype>
<url>http://mydomain.com</url>
<linktype>mytype2</linktype>
<url>http://somedomain.com</url>
</sso_links>')

Теперь выберите нужные значения

SELECT xCol.value('(/sso_links//linktype/node())[1]', 'nvarchar(max)') AS linktype
      ,xCol.value('(/sso_links//url/node())[1]', 'nvarchar(max)') AS url
      ,xCol.value('(/sso_links//linktype/node())[2]', 'nvarchar(max)') AS linktype2
      ,xCol.value('(/sso_links//url/node())[2]', 'nvarchar(max)') AS url2
  FROM docs 
 WHERE pk = 1

Попробуйте!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...