2009-08-13 8 views
0

I ont la colonne XML dans ma table qui peut contenir XML comme ces 2 dossiers:En utilisant XML.Query pour filtrer plusieurs valeurs

fiche 1, supposons que ID d'enregistrement est 1 et le contenu XML est

<content> 
<node1 >10</node1> 
<node2 >20</node2> 
<node3 >30</node3> 
<node4 >40</node4> 
<node5 >50</node5> 
</content> 

fiche 2, supposons que ID d'enregistrement est 2 et le contenu XML est

<content> 
<node_name_1 >10</node_name_1> 
<hello >20</hello> 
</content> 

Je veux savoir ID d'enregistrements ayant une valeur de noeud interne de 10.

declare @ids nvarchar(500) 
set @ids = '10'; 
select id from tablename 
where 
convert(nvarchar(max),xmlfieldname.query('data(/content/* = (sql:variable("@ids")) )')) = 'true' 

Ceci fonctionne parfaitement, mais mon problème est quand je veux utiliser plusieurs valeurs pour les nœuds internes. Je veux savoir les ID des enregistrements dont les valeurs internes sont 10 ou 20. Cette requête fonctionne parfaitement:

select id from tablename 
where 
convert(nvarchar(max),xmlfieldname.query('data(/content/* = (10,20) )')) = 'true' 

Mais quand j'utilise sql: variable, rien n'est retourné!

declare @ids nvarchar(500) 
set @ids = '10,20'; 
select id from tablename 
where 
convert(nvarchar(max),xmlfieldname.query('data(/content/* = (sql:variable("@ids")) )')) = 'true' 

comment puis-je utiliser quelque chose comme Select * from mytable NomChamp dans ('123', '456') en XML?

Répondre

0

Vous lui demandez de trouver l'entrée qui a "10,20" pour cette valeur, comme si vous disiez "where fieldname in ('10, 20 ')".

Il est la vieillesse question de Split ...

Alors ... essayez:

declare @qry nvarchar(max); 
select @qry = 'select id from tablename where convert(nvarchar(max),xmlfieldname.query(''data(/content/* = (' + @ids + ') )'')) = ''true'''; 
exec sp_executesql @qry 

Rob

Questions connexes