2012-01-10 2 views
3

Вот что я делаю. Я вставив файл XML в столбец XML, наряду с другими колонками, такие как отметки даты и т.д. для лесозаготовок (те не имеют никакого отношения к этому запросу)Разбивайте XML-файлы, используя SQL Server, в отдельные строки

файл выглядит как что-то похожее на это:

<topLevelItem> 
    <secondLevelItem> 
    <secondLevelItemDetail> 
    </secondLevelItemDetail> 
    <secondLevelItemAnotherDetail> 
    </secondLevelItemAnotherDetail> 
    </secondLevelItem> 
    <secondLevelItem> 
    <secondLevelItemDetail> 
    </secondLevelItemDetail> 
    <secondLevelItemAnotherDetail> 
    </secondLevelItemAnotherDetail> 
    </secondLevelItem> 
    <secondLevelItem> 
    <secondLevelItemDetail> 
    </secondLevelItemDetail> 
    <secondLevelItemAnotherDetail> 
    </secondLevelItemAnotherDetail> 
    </secondLevelItem> 
<topLevelItem> 

Моя цель - запросить поле XML и получить набор результатов с каждым <secondLevelItem> в собственной строке, в форме XML. Такие, как показано ниже:

Ряд 1:

<secondLevelItem> 
    <secondLevelItemDetail> 
    </secondLevelItemDetail> 
    <secondLevelItemAnotherDetail> 
    </secondLevelItemAnotherDetail> 
    </secondLevelItem> 

Row 2:

<secondLevelItem> 
    <secondLevelItemDetail> 
    </secondLevelItemDetail> 
    <secondLevelItemAnotherDetail> 
    </secondLevelItemAnotherDetail> 
    </secondLevelItem> 

Row 3:

<secondLevelItem> 
    <secondLevelItemDetail> 
    </secondLevelItemDetail> 
    <secondLevelItemAnotherDetail> 
    </secondLevelItemAnotherDetail> 
    </secondLevelItem> 

Это должно быть сделано с помощью Microsoft SQL Server и без использования CLI. Мне нужно иметь возможность объявить, какой узел XML я хочу разбить, чтобы начать, так как некоторые файлы имеют дополнительные элементы XML, которые мне не нужны. Так что-то вроде, WHERE node = secondLevelItem.

ответ

2

С SQL Server 2005 и более поздними версиями в SQL Server есть отличная поддержка XQuery.

Этот подход здесь будет с помощью .nodes() и .query() метод:

SELECT 
    Col.query('.') 
FROM 
dbo.YourTable 
CROSS APPLY 
    YourXmlColumn.nodes('/topLevelItem/secondLevelItem') AS Tbl(Col) 
WHERE 
    (some condition) 

.nodes() функция создает «временный, встроенный» псевдо таблицы Tbl с одного столбца Col, который содержит запись один XML для каждого узла ваш столбец XML, соответствующий указанному XPath (в этом случае: каждый <secondLevelItem> внутри <topLevelItem> будет соответствовать).

Поскольку вы хотите весь XML для каждого из этих элементов XML, просто используйте .query('.'), чтобы вернуть этот полный XML-элемент.

1

Если вы просто поставляете оригинал XML в хранимую процедуру и не вытаскиваете его из таблицы, вы можете сделать следующее.

DECLARE @XML xml 
SET @XML = '<topLevelItem> 
    <secondLevelItem> 
    <secondLevelItemDetail>One</secondLevelItemDetail> 
    <secondLevelItemAnotherDetail>One One</secondLevelItemAnotherDetail> 
    </secondLevelItem> 
    <secondLevelItem> 
    <secondLevelItemDetail>Two</secondLevelItemDetail> 
    <secondLevelItemAnotherDetail>Two Two</secondLevelItemAnotherDetail> 
    </secondLevelItem> 
    <secondLevelItem> 
    <secondLevelItemDetail>Three</secondLevelItemDetail> 
    <secondLevelItemAnotherDetail>Three Three</secondLevelItemAnotherDetail> 
    </secondLevelItem> 
</topLevelItem>' 


SELECT 
    Tbl.Col.query('.') 
FROM 
    @XML.nodes('/topLevelItem/secondLevelItem') AS Tbl(Col) 
Смежные вопросы