Query su xml
-
mercoledì 9 maggio 2012 15:21
Ho un campo xml per la gestione dinamica di campi (permetto all'utente di inserire nuovi campi in tabella con relativi valori).
Per fare questo, tramite un dataContract serailizer (come suggeritomi in un vecchio post) salvo sul db un dictionary<string, string> dove il key inidica il nome campo e il value il suo valore.
veniamo al punto: ho bisogno di fare una select per ottenere tutte le righe dove nel campo xml ci sia un key=campo1 e value=valore1.
Supponendo di avere un record di tabella MyTable avente nel campo xml MyXml il seguente:
<DynamicProfile xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/WinTest">
<AllData xmlns:d2p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
<d2p1:KeyValueOfstringstring>
<d2p1:Key>Campo1</d2p1:Key>
<d2p1:Value>Valore1</d2p1:Value>
</d2p1:KeyValueOfstringstring>
<d2p1:KeyValueOfstringstring>
<d2p1:Key>Campo2</d2p1:Key>
<d2p1:Value>Valore2</d2p1:Value>
</d2p1:KeyValueOfstringstring>
</AllData>
</DynamicProfile>Dovrei fare una query dicendo: select * from myTable where campo1 = valore1 ed è CHIARO e FONDAMENTALE che il valore del nodo Value sia quello successivo al nodo con Key = Campo1, altrimenti come potete ben capire rischio di ottenere un value di un altro campo.
Infatti, il seguente modo non è corretto:
;WITH XMLNAMESPACES
(
'http://schemas.microsoft.com/2003/10/Serialization/Arrays' as d2p1
)
select * from MyTable where
MyXmlField.exist('//d2p1:Key[.="Campo1"]') = 1
AND MyXmlField.exist('//d2p1:Value[.="Valore1"]') = 1 -- Nota: se Scrivo Valore2 la query restituisce lo stesso una riga ed è sbagliatoQualcuno puo aiutarmi?
Tutte le risposte
-
mercoledì 9 maggio 2012 20:34
Ciao,
Ti ho risposto nel thread aperto sul forum dedicato a SQL Server.
Ciao!
Lorenzo Benaglia
http://blogs.dotnethell.it/lorenzo
http://social.technet.microsoft.com/Forums/it-IT/sqlserverit- Contrassegnato come risposta ifCodeIsTrue giovedì 10 maggio 2012 07:42

