2010-09-23 2 views
1

J'ai une colonne dans une base de données SQL Server 2005 qui contient un XML stocké sous forme de chaîne. Au sein de ce XML est l'arborescence des éléments suivantsEn utilisant TSQL, les résultats XQuery renvoient> 1 ID que j'ai besoin de rechercher dans une requête

<DriverDetails> 
    <DriverDetail> 
    <ID>2334</ID> 
    <PRN>1</PRN> 
    </DriverDetail> 
    <DriverDetail> 
    <ID>2335</ID> 
    <PRN>2</PRN> 
    </DriverDetail> 
    <DriverDetail> 
    <ID>2336</ID> 
    <PRN>3</PRN> 
    </DriverDetail> 
    <DriverDetail> 
    <ID>2337</ID> 
    <PRN>4</PRN> 
    </DriverDetail> 
</DriverDetails> 

Je l'ai récupéré ce en utilisant:

CONVERT(xml, detailRiskInformation).query(' 
      //DriverDetails 
     ') 

J'ai besoin d'interroger chaque ID dans chaque nœud DriverDetail pour voir si existe dans une autre table, appelée DriverDetails . La colonne appropriée est [DriverDetail]. [Id].

Maintenant, je peux courir XQuery comme ceci:

CONVERT(xml, detailRiskInformation).query(' 
      for $i in //DriverDetail 
      return data($i) 
     ') 

Cependant, il retourne un seul résultat avec les 4 ID séparés par des espaces.

Comment puis-je effectuer une requête itérative sur chacun de ces ID dans une requête? Ou, sinon, comment puis-je les obtenir en utilisant un curseur ou quelque chose de beaucoup plus intelligent?

Merci à l'avance Ant

Répondre

1

Si vous souhaitez récupérer les valeurs d'identité en tant que « table » à utiliser dans une sélection, essayez quelque chose comme ça

DECLARE @xml XML 

SET @xml = ' 
<DriverDetails> 
    <DriverDetail> 
    <ID>2334</ID> 
    <PRN>1</PRN> 
    </DriverDetail> 
    <DriverDetail> 
    <ID>2335</ID> 
    <PRN>2</PRN> 
    </DriverDetail> 
    <DriverDetail> 
    <ID>2336</ID> 
    <PRN>3</PRN> 
    </DriverDetail> 
    <DriverDetail> 
    <ID>2337</ID> 
    <PRN>4</PRN> 
    </DriverDetail> 
</DriverDetails> 
' 

SELECT T.c.value('.', 'int') ID 
FROM @xml.nodes('/DriverDetails/DriverDetail/ID') T(c) 

Ou d'une colonne de table, il serait être quelque chose comme

DECLARE @Table TABLE(
     XmlVal XML 
) 

INSERT INTO @Table 
SELECT '<DriverDetails> 
    <DriverDetail> 
    <ID>2334</ID> 
    <PRN>1</PRN> 
    </DriverDetail> 
    <DriverDetail> 
    <ID>2335</ID> 
    <PRN>2</PRN> 
    </DriverDetail> 
    <DriverDetail> 
    <ID>2336</ID> 
    <PRN>3</PRN> 
    </DriverDetail> 
    <DriverDetail> 
    <ID>2337</ID> 
    <PRN>4</PRN> 
    </DriverDetail> 
</DriverDetails> 
' 

INSERT INTO @Table 
SELECT '<DriverDetails> 
    <DriverDetail> 
    <ID>1</ID> 
    <PRN>1</PRN> 
    </DriverDetail> 
    <DriverDetail> 
    <ID>2</ID> 
    <PRN>2</PRN> 
    </DriverDetail> 
    <DriverDetail> 
    <ID>3</ID> 
    <PRN>3</PRN> 
    </DriverDetail> 
    <DriverDetail> 
    <ID>4</ID> 
    <PRN>4</PRN> 
    </DriverDetail> 
</DriverDetails> 
' 


SELECT T2.Loc.value('.', 'int') ID 
FROM @Table T 
CROSS APPLY XmlVal.nodes('/DriverDetails/DriverDetail/ID') as T2(Loc) 
+0

C'est exactement ce que je recherchais, merci. –

+0

... Cela dit, je n'ai aucune idée de ce que ce T.c. malarkey est - avez-vous un lien vers une explication supplémentaire sur ce que je fais exactement? –

+0

Jetez un oeil à http://msdn.microsoft.com/en-us/library/ms189887.aspx et http://msdn.microsoft.com/en-us/library/ms190798.aspx et http: // www .code-magazine.com/Article.aspx? quickid = 0605081 –

Questions connexes