Con risposta 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 è sbagliato

    Qualcuno puo aiutarmi?

Tutte le risposte