Строки фильтра, возвращаемые из SQL-запроса по полю типа XML с использованием Xquery - PullRequest
0 голосов
/ 21 января 2009

У меня есть таблица, в которой хранятся данные об ошибках (через 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

Может кто-нибудь помочь с синтаксисом. Я смог по существу использовать производную таблицу, превращая каждый элемент в столбец, а затем запрашивать это, но, похоже, должен быть более простой способ сказать, дать мне все атрибуты (идентификатор, категория, детали) для каждой строки которые имеют details.seq = 'xxxxx'.

1 Ответ

0 голосов
/ 21 декабря 2010

Передумал и использовал 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
...