SQL: как я могу получить значение атрибута в типе данных XML - PullRequest
25 голосов
/ 10 января 2012

В моей базе данных есть следующий xml:

<email>
  <account language="en" ... />
</email>

Я сейчас использую что-то вроде этого: но все равно нужно найти значение атрибута

 SELECT
convert(xml,m.Body).query('/Email/Account')
 FROM Mail

Как я могу получить значение атрибута language в моем операторе select с SQL?

Ответы [ 3 ]

41 голосов
/ 10 января 2012

Использование XQuery:

declare @xml xml =
'<email>
  <account language="en" />
</email>'

select @xml.value('(/email/account/@language)[1]', 'nvarchar(max)')

declare @t table (m xml)

insert @t values 
    ('<email><account language="en" /></email>'), 
    ('<email><account language="fr" /></email>')

select m.value('(/email/account/@language)[1]', 'nvarchar(max)')
from @t

Вывод:

en
fr
9 голосов
/ 10 января 2012

Это должно работать:

DECLARE @xml XML

SET @xml = N'<email><account language="en" /></email>'

SELECT T.C.value('@language', 'nvarchar(100)')
FROM @xml.nodes('email/account') T(C)
4 голосов
/ 10 января 2012

Это во многом зависит от того, как вы запрашиваете документ.Вы можете сделать это, хотя:

CREATE TABLE #example (
   document NText
);
INSERT INTO #example (document)
SELECT N'<email><account language="en" /></email>';

WITH XmlExample AS (
  SELECT CONVERT(XML, document) doc
  FROM #example
)
SELECT
  C.value('@language', 'VarChar(2)') lang
FROM XmlExample CROSS APPLY
     XmlExample.doc.nodes('//account') X(C);

DROP TABLE #example;

РЕДАКТИРОВАТЬ после изменения вашего вопроса.

...