2014-10-14 4 views
2

Я следующие данные XML хранятся в таблице SQLИзвлечение XML данных с помощью SQL

<CustomFields xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      xmlns="http://www.kaseya.com/vsa/2007/12/ServiceDeskDefinition.xsd"> 
<Field fieldName="ChangeRequest">No</Field> 
<Field fieldName="ProblemRecord">No</Field> 
<Field fieldName="Source">Email</Field> 
<Field fieldName="KB_Article">No</Field> 
<Field fieldName="OptimusRef">264692</Field> 
<Field fieldName="TimeSpentOnTicket">0.25</Field> 
<Field fieldName="PONumber" /> 
<Field fieldName="ResourceAssignedEngineer" /> 

То, что я хотел бы сделать, это выбрать TimeSpentOnTicket Значение формирования хранимой процедуры.

Любые идеи, как я могу это сделать?

ответ

1

Проблема здесь в вашем XML. Это недействительно, поэтому на самом деле нет способа найти его, пока вы его не исправите. Простой способ проверить это - использовать онлайн-инструмент, например, one at W3Schools. Еще одна проблема, которую я вижу, заключается в том, что пространство имен (xmlns), которое вы указали, больше не существует. Я думаю, что это тоже испортит Postgres, но я не на это 100%. Возможно, вам придется фильтровать это при проглатывании. Однако, после исправления XML, довольно легко получить информацию, используя XPath в соответствующем XML function.

Например, с помощью следующей таблицы:

CREATE TABLE BLA.TEMPTABLE (ID INT, MYXML XML) 

Затем вставьте действительную версию XML:

INSERT INTO BLA.TEMPTABLE (ID, MYXML) 
SELECT 1 as ID, 
    '<?xml version="1.0" encoding="UTF-8"?> 
    <CustomFields> 
     <Field fieldName="ChangeRequest">No</Field> 
     <Field fieldName="ProblemRecord">No</Field> 
     <Field fieldName="Source">Email</Field> 
     <Field fieldName="KB_Article">No</Field> 
     <Field fieldName="OptimusRef">264692</Field> 
     <Field fieldName="TimeSpentOnTicket">0.25</Field> 
     <Field fieldName="PONumber" /> 
     <Field fieldName="ResourceAssignedEngineer" /> 
    </CustomFields>' as MYXML 

Затем, чтобы запросить его обратно, вы можете сделать что-то вроде следующее (вы можете проверить свои XPath с помощью инструмента, как this, если вам нужно):

SELECT 
    tt.ID, 
    tt.MYXML, 
    XPATH('/CustomFields//Field[@fieldName=''TimeSpentOnTicket'']/text()', tt.MYXML) 
FROM 
    BLA.TEMPTABLE tt 
+0

к слову, XPATH Ретур ns массив, поэтому, если вам нужно только первое значение в массиве, вы можете сделать что-то вроде следующего: SELECT ID, MYXML, (XPATH ('/ CustomFields // Field [@fieldName =' 'TimeSpentOnTicket' ']/text() ', MYXML)) [1] FROM BLA.TEMPTABLE' – jlgrock

Смежные вопросы