SQL: Comment puis-je obtenir la valeur d'un attribut dans XML datatype

j'ai le xml suivant dans ma base de données:

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

j'utilise quelque chose comme ça maintenant: mais je dois quand même trouver la valeur de l'attribut

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

Comment puis-je obtenir la valeur de l' language attribut dans ma déclaration select avec SQL?

20
demandé sur Kirill Polishchuk 2012-01-10 22:41:13

3 réponses

Use XQuery:

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

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

declare @t table (m ntext)

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



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

Sortie:

en
fr
33
répondu Kirill Polishchuk 2012-01-10 18:54:13

Cela devrait fonctionner:

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)
7
répondu Bassam Mehanni 2012-01-10 18:48:00

cela dépend beaucoup de la façon dont vous interrogez le document. Vous pouvez faire ceci:

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;

EDIT après modifications à votre question.

2
répondu Yuck 2012-01-10 18:55:44