2009-01-21 5 views
0

J'ai une table qui stocke les données sur les erreurs qui se produisent (via SSIS), la colonne principale contenant des informations est stockée en XML. Je veux pouvoir interroger les paires nom/valeur dans cette colonne.Filtrer les lignes renvoyées à partir de la requête SQL par champ de type XML à l'aide de Xquery

Pour expliquer dans SQL: SELECT * FROM #tmp WHERE seq='7406834'

table Exemple:

CREATE TABLE #tmp(id INT, category varchar(10), details xml) 

    INSERT INTO #tmp(id,category,details) values (1,'cat1','<fields><field name="brnum" value="586" /><field name="qty" value="0" /><field name="seq" value="7406815" /></fields>') 
    INSERT INTO #tmp(id,category,details) values (1,'cat2','<fields><field name="brnum" value="586" /><field name="qty" value="0" /><field name="seq" value="7406817" /></fields>') 
    INSERT INTO #tmp(id,category,details) values (1,'cat3','<fields><field name="brnum" value="586" /><field name="qty" value="0" /><field name="seq" value="7406834" /></fields>') 
    INSERT INTO #tmp(id,category,details) values (1,'cat4','<fields><field name="brnum" value="586" /><field name="qty" value="0" /><field name="seq" value="7406841" /></fields>') 

DROP TABLE #tmp 

Quelqu'un peut-il aider à la syntaxe. J'ai été capable d'utiliser essentiellement une table dérivée, en faisant chaque élément dans une colonne, puis de l'interroger, mais il semble qu'il devrait y avoir une façon plus simple de dire tous les attributs (identifiant, catégorie, détails) pour chaque ligne qui ont un details.seq = 'xxxxx'.

Répondre

0

me ravise, et utilisé FLWOR: P

CREATE TABLE #tmp 
    (
     id INT 
    , category VARCHAR(10) 
    , details XML 
    ) 

INSERT INTO #tmp 
     (id 
     , category 
     , details 
     ) 
VALUES (1 
     , 'cat1' 
     , '<fields><field name="brnum" value="586" /><field name="qty" value="0" /><field name="seq" value="7406815" /></fields>' 
     ) 
INSERT INTO #tmp 
     (id 
     , category 
     , details 
     ) 
VALUES (1 
     , 'cat2' 
     , '<fields><field name="brnum" value="586" /><field name="qty" value="0" /><field name="seq" value="7406817" /></fields>' 
     ) 
INSERT INTO #tmp 
     (id 
     , category 
     , details 
     ) 
VALUES (1 
     , 'cat3' 
     , '<fields><field name="brnum" value="586" /><field name="qty" value="0" /><field name="seq" value="7406834" /></fields>' 
     ) 
INSERT INTO #tmp 
     (id 
     , category 
     , details 
     ) 
VALUES (1 
     , 'cat4' 
     , '<fields><field name="brnum" value="586" /><field name="qty" value="0" /><field name="seq" value="7406841" /></fields>' 
     ) 

DECLARE @val INT = 7406834 


SELECT * 
FROM #tmp t 
WHERE details.value('(for $f in //field 
         where data($f/@name) = "seq" 
         return 
          data($f/@value))[1]', 'int') = @val 


DROP TABLE #tmp 
Questions connexes