Con risposta Query su campo xml

  • mercoledì 9 maggio 2012 12:24
     
     

    Uso Sql versione 2008.

    Ho una classica tabella ad esempio con IdProdotto, NomProdotto e DinamycData dove questo DynamicData è un campo xml.

    Supponendo di avere il seguente contenuto nel campo xml

    <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>MyFirstKey</d2p1:Key>
          <d2p1:Value>MyFirstValue</d2p1:Value>
        </d2p1:KeyValueOfstringstring>
        <d2p1:KeyValueOfstringstring>
          <d2p1:Key>MySecondKey</d2p1:Key>
          <d2p1:Value>MySecondValue</d2p1:Value>
        </d2p1:KeyValueOfstringstring>
      </AllData>
    </DynamicProfile>

    Come posso scrivere una query che mi restituisca tutti i record dove DynamicaData contiene key=MyFirstKey AND Value=MyFirstValue?

Tutte le risposte

  • mercoledì 9 maggio 2012 20:28
    Moderatore
     
     Con risposta Contiene codice

    Come posso scrivere una query che mi restituisca tutti i record dove DynamicaData contiene key=MyFirstKey AND Value=MyFirstValue?

    Ciao,

    Potresti utilizzare il metodo exist del data type XML per eseguire una query simile al seguente esempio:

    USE tempdb;
    
    CREATE TABLE dbo.foo(
    c1 int NOT NULL,
    c2 xml NOT NULL
    );
    
    INSERT dbo.foo
    VALUES (1, '<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>MyFirstKey</d2p1:Key> 
          <d2p1:Value>MyFirstValue</d2p1:Value> 
        </d2p1:KeyValueOfstringstring> 
        <d2p1:KeyValueOfstringstring> 
          <d2p1:Key>MySecondKey</d2p1:Key> 
          <d2p1:Value>MySecondValue</d2p1:Value> 
        </d2p1:KeyValueOfstringstring> 
      </AllData> 
    </DynamicProfile>')
        , (2, '<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>MyFirstKey</d2p1:Key> 
          <d2p1:Value>MyFirstValue</d2p1:Value> 
        </d2p1:KeyValueOfstringstring> 
      </AllData> 
    </DynamicProfile>')
        , (3, '<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>MySecondKey</d2p1:Key> 
          <d2p1:Value>MySecondValue</d2p1:Value> 
        </d2p1:KeyValueOfstringstring> 
      </AllData> 
    </DynamicProfile>')
        , (4, '<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>MyFirstKey</d2p1:Key> 
        </d2p1:KeyValueOfstringstring> 
      </AllData> 
    </DynamicProfile>')
        , (5, '<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:Value>MyFirstValue</d2p1:Value> 
        </d2p1:KeyValueOfstringstring> 
      </AllData> 
    </DynamicProfile>');
    
    --Come posso scrivere una query che mi restituisca tutti i record dove DynamicaData contiene key=MyFirstKey AND Value=MyFirstValue?
    WITH XMLNAMESPACES ('http://schemas.microsoft.com/2003/10/Serialization/Arrays' as d2p1, DEFAULT 'http://schemas.datacontract.org/2004/07/WinTest')
    SELECT *
    FROM dbo.foo
    WHERE c2.exist('/DynamicProfile/AllData/d2p1:KeyValueOfstringstring/d2p1:Key[(text()[1]) = "MyFirstKey"]') = 1
    AND c2.exist('/DynamicProfile/AllData/d2p1:KeyValueOfstringstring/d2p1:Value[(text()[1]) = "MyFirstValue"]') = 1;
    
    /* Output:
    
    c1          c2
    ----------- -------------------
    1           <DynamicProfile...
    2           <DynamicProfile...
    
    (2 row(s) affected)
    
    */
    
    DROP TABLE dbo.foo;

    Ciao!


    Lorenzo Benaglia
    http://blogs.dotnethell.it/lorenzo
    http://social.technet.microsoft.com/Forums/it-IT/sqlserverit