Обход документа XML в столбце базы данных SQL Server 2008 - PullRequest
0 голосов
/ 13 ноября 2009

У меня есть таблица, которая содержит столбец с типом данных XML. Я ищу, чтобы посмотреть на всю таблицу, включая столбец типа данных XML. Представление расширит содержимое столбца типа данных XML. У меня возникла проблема с возможностью прохождения по всему документу XML и получения значений из определенных узлов XML.

Я использую этот SQL-запрос, и он получает только первый экземпляр значения для XML-узла FuelPathwayCode. Я просматриваю весь XML-документ и запрашиваю ВСЕ значения XML-узла / FuelPathwayCode в одном наборе результатов?

SELECT 
   UploadFileID, Year, Quarter, 
   FileContent.value('(LCFS-Report/Fuel/FuelPathwayCode)[1]', 'varchar(100)') as FuelPathwayCode 
FROM LC_UploadXM

Я ищу такой набор результатов:

UploadFileID  Year  Quarter  FuelPathWayCode   PhysicalPathwayCode
8             2010  4        CARBOB001         PP001
8             2010  4        CARBOB002-HIGH    PP001  

Столбцы таблицы:

UploadFileID,
Year,
Quarter,
CompanyID,
FileType,
FileContent,
FileName,
Description,
Success,
AddBy,
AddDttm

Ответы [ 2 ]

1 голос
/ 13 ноября 2009

Вам нужно сделать CROSS APPLY и выбрать бит XML, который вам нужен, а затем вам нужно выполнить серию .value вызовов по следующим вопросам:

SELECT 
   UploadFileID, Year, Quarter, 
   FC.Node.value('(FuelPathwayCode)[1]', 'varchar(100)') as FuelPathwayCode 
FROM 
   LC_UploadXM
CROSS APPLY 
   FileContent.nodes('/LCFS-Report/Fuel') as FC(Node)

Это в основном берет все ваши XML-узлы, присутствующие в этом XPath /LCFS-Report/Fuel, и использует их, как если бы они были строками в таблице (схема - FC, имя "виртуальной таблицы" - "Node" - их можно использовать как вам угодно, полностью зависит от вас), а затем кросс применяет эти строки к базовому выбору.

Этот «виртуальный стол» FC.Node теперь можно запрашивать для отдельных значений - например, ваш «указатель» в XML уже находится в подузле «Fuel» в XML, и теперь вы можете получить доступ к отдельным значениям внутри него с помощью вызова .value().

Прочтите вступительную статью Алекса Гомера SQL Server 2005 XQuery - отличный ресурс!

0 голосов
/ 13 ноября 2009

Значение - скалярная функция. Попробуйте вместо этого использовать query ().

http://msdn.microsoft.com/en-us/library/ms191474.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...