2010-12-13 9 views
4

Je varchar (max) des données XML stockées dans une colonne varchar (max) sur SQL Server 2005. Les données sont sous la forme (FQTN = nom complet du type):Sélectionnez XML de la colonne

<?xml version="1.0" encoding="utf-16"?> 
<History xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <EntityViews> 
    <EntityProxy Type="FQTN" Key="386876" /> 
    <EntityProxy Type="FQTN" Key="387981" /> 
    <!-- etc. --> 
    </EntityViews> 
</History> 

Comment puis-je sélectionner Type, Key pour obtenir un résultat tabulaire à partir des données XML de cette colonne pour une seule ligne? La table a une clé primaire d'identité nommée HistoryId.

+2

Ne serait-il pas plus facile de faire le type de données colonne 'XML' et nous XPath? – Brad

+0

Probablement mais ce n'est pas nouveau développement. J'ai créé la table et je ne me souviens pas si nous étions sur 2005, 2000 ou Oracle à l'époque. Comment j'aurais dû le faire est une question différente. –

Répondre

7
;with cteCastToXML as (
    select CAST(YourColumn as xml) as x 
     from YourTable 
) 
select h.ep.value('@Type','varchar(10)') as [Type], 
     h.ep.value('@Key', 'varchar(10)') as [Key] 
    from cteCastToXML 
     cross apply x.nodes('/History/EntityViews/EntityProxy') as h(ep) 
+0

Merci! Le seul changement substantiel que j'ai dû faire était que YourColumn doit être converti en nvachar (max) avant d'être converti en xml car l'encodage est utf-16. –

0

Ma recommandation serait double.

  1. Si c'est ce que vous allez faire avec la colonne, changez la colonne en colonne XML.
  2. Si vous avez besoin de le faire une fois, prenez la valeur et convertissez-la en XML, vous pourrez alors l'utiliser comme vous le feriez normalement. (Voici un link sur la façon de convertir).
Questions connexes