2015-07-08 5 views
0

У меня есть одно поле в БД, которое содержит столбцы данных, но в непрерывной строке XML. Я хочу извлечь данные из XML и вернуться как обычные столбцы. В этом одиночном поле может быть несколько строк данных.XML Data in Row Selection

Вот 2 реальные примеры данных в этой области

Пример 1:

<DocumentElement>  
    <AuditTrailDetail>  
     <TableName>order_header_total</TableName>  
     <RowID>837</RowID>  
     <AuditType>Edit</AuditType>  
     <FieldName>oht_foreign_net</FieldName>  
     <ValueFrom>65.1600</ValueFrom>  
     <ValueTo>115.1600</ValueTo>  
     <EntityName />  
     <DisplayName />  
     <Identifier />  
    </AuditTrailDetail> 
    <AuditTrailDetail>  
     <TableName>order_line_item</TableName>  
     <RowID>2442</RowID>  
     <AuditType>Edit</AuditType>  
     <FieldName>oli_qty_required</FieldName>  
     <ValueFrom>1.0000</ValueFrom>  
     <ValueTo>2.0000</ValueTo>  
     <EntityName />  
     <DisplayName />  
     <Identifier>61 - test</Identifier>  
    </AuditTrailDetail> 
</DocumentElement> 

Пример 2:

<DocumentElement> 
    <AuditTrailDetail>  
     <TableName>order_line_item</TableName>  
     <RowID>2446</RowID>  
     <AuditType>Edit</AuditType>  
     <FieldName>oli_description</FieldName>  
     <ValueFrom>2 Ply Tissue Masks</ValueFrom>  
     <ValueTo>2 Ply Tissue Masksdd</ValueTo>  
     <EntityName />  
     <DisplayName />  
     <Identifier>D/D170 - 2 Ply Tissue Masksdd</Identifier> 
    </AuditTrailDetail> 
</DocumentElement> 

Для примера 1, Я хотел бы вернуть 2 строки как указано ниже:

example1

В примере 2 имеется одна строка, и я хотел бы его, как показано ниже:

Example2

Поля в таблице:

owat_id 
owat_audit_type 
owat_record_id 
owat_record_type 
owat_datetime 
owat_ud_id 
owat_details 

данные XML, находится в пределах owat_details.

Предположим, что имя таблицы Audit_Trail.

Как это сделать непосредственно в SQL-запросе?

+1

Вы знакомы с XQuery? http://www.w3schools.com/xquery/xquery_example.asp –

+0

Совсем нет. Вероятно, я должен был упомянуть, что это должно быть сделано полностью в SQL-запросе. – OWSam

+1

XQuery используется в вашем запросе sql :) https://technet.microsoft.com/en-us/library/ms345122(v=sql.90).aspx –

ответ

0

Спасибо Johnie Карр

Я получил эту работу с помощью XQuery.

Мне нужно сделать 2 запроса и объединить их, чтобы получить 2 отдельных элемента в одном поле в виде отдельных строк. Я уверен, что есть более чистое решение, но это работает.

Большое спасибо :)

SELECT 
AuditTrail.owat_record_type, 
AuditTrail.owat_audit_type, 
AuditTrail.owat_datetime as 'Audit Date', 
user_detail.ud_username as 'User', 
AuditTrail.owat_details.value('(/DocumentElement/AuditTrailDetail/TableName)[1]','varchar(50)') AS TableName, 
AuditTrail.owat_details.value('(/DocumentElement/AuditTrailDetail/RowID)[1]','varchar(50)') AS RowID, 
AuditTrail.owat_details.value('(/DocumentElement/AuditTrailDetail/FieldName)[1]','varchar(50)') AS FieldName, 
AuditTrail.owat_details.value('(/DocumentElement/AuditTrailDetail/ValueFrom)[1]','varchar(50)') AS ValueFrom, 
AuditTrail.owat_details.value('(/DocumentElement/AuditTrailDetail/ValueTo)[1]','varchar(50)') AS ValueTo, 
AuditTrail.owat_details.value('(/DocumentElement/AuditTrailDetail/Identifier)[1]','varchar(50)') AS Identifier 
FROM 

    (select 
    orderwise_audit_trail.owat_id, 
    orderwise_audit_trail.owat_audit_type, 
    orderwise_audit_trail.owat_record_id, 
    orderwise_audit_trail.owat_record_type, 
    orderwise_audit_trail.owat_datetime, 
    orderwise_audit_trail.owat_ud_id, 
    convert(xml, orderwise_audit_trail.owat_details) as owat_details 
    from 
    orderwise_audit_trail) as AuditTrail 

left join user_detail on user_detail.ud_id = AuditTrail.owat_ud_id 

Where AuditTrail.owat_details is not NULL 
and (AuditTrail.owat_details.value('(/DocumentElement/AuditTrailDetail/TableName)[1]','varchar(50)')) is not null 

UNION ALL 

SELECT 
AuditTrail.owat_record_type, 
AuditTrail.owat_audit_type, 
AuditTrail.owat_datetime as 'Audit Date', 
user_detail.ud_username as 'User', 
AuditTrail.owat_details.value('(/DocumentElement/AuditTrailDetail/TableName)[2]','varchar(50)') AS TableName, 
AuditTrail.owat_details.value('(/DocumentElement/AuditTrailDetail/RowID)[2]','varchar(50)') AS RowID, 
AuditTrail.owat_details.value('(/DocumentElement/AuditTrailDetail/FieldName)[2]','varchar(50)') AS FieldName, 
AuditTrail.owat_details.value('(/DocumentElement/AuditTrailDetail/ValueFrom)[2]','varchar(50)') AS ValueFrom, 
AuditTrail.owat_details.value('(/DocumentElement/AuditTrailDetail/ValueTo)[2]','varchar(50)') AS ValueTo, 
AuditTrail.owat_details.value('(/DocumentElement/AuditTrailDetail/Identifier)[2]','varchar(50)') AS Identifier 

FROM 

    (select 
    orderwise_audit_trail.owat_id, 
    orderwise_audit_trail.owat_audit_type, 
    orderwise_audit_trail.owat_record_id, 
    orderwise_audit_trail.owat_record_type, 
    orderwise_audit_trail.owat_datetime, 
    orderwise_audit_trail.owat_ud_id, 
    convert(xml, orderwise_audit_trail.owat_details) as owat_details 
    from 
    orderwise_audit_trail) as AuditTrail 

left join user_detail on user_detail.ud_id = AuditTrail.owat_ud_id 

Where AuditTrail.owat_details is not NULL 
and (AuditTrail.owat_details.value('(/DocumentElement/AuditTrailDetail/TableName)[2]','varchar(50)')) is not null 

order by 1, 2, 3, 4 
+0

Добро пожаловать :) –