2009-01-21 35 views
0

我有一个存储关于发生错误(通过SSIS)的数据的表,其中存储信息的主列以XML存储。我希望能够查询此列中的名称/值对。过滤使用Xquery通过XML查询使用XML类型字段返回的行

在SQL解释:SELECT * FROM #tmp WHERE seq='7406834'

示例表:

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 

任何人都可以用的语法帮助。我已经能够基本上使用派生表,将每个元素都变成一个列,然后查询它,但似乎应该有一种更简单的方式来说明给每个行的所有属性(id,类别,细节)有一个details.seq ='xxxxx'。

回答

0

改变了主意,并使用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