0

我有一个表存储有关发生的错误的数据(通过 SSIS),具有信息的主列存储为 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'。

4

1 回答 1

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
于 2010-12-21T20:40:56.903 回答