[英]Select XML elements into table rows in SQL Server
我在表中的單行中有如下所示的XML(表中有很多行):
<?xml version="1.0" encoding="UTF-8"?>
<AuditTrail>
<Action />
<ActionDetail />
<ChangesXML>
<Details>
<Object ObjectType="Data.Review_Extension" AuditType="Modified" FriendlyName="Review">
<ObjectKeys>
<ReviewExtID>21482283</ReviewExtID>
</ObjectKeys>
<Properties>
<Property name="Document Type 01" FieldName="Document_Type_01" TemplateFieldID="644140" ReviewExtensionID="214822182" PropertyType="System.String">
<OldValue />
<NewValue><![CDATA[1145]]></NewValue>
</Property>
<Property name="Document Type 02" FieldName="Document_Type_02" TemplateFieldID="644141" ReviewExtensionID="21482283" PropertyType="System.String">
<OldValue />
<NewValue><![CDATA[123]]></NewValue>
</Property>
</Properties>
</Object>
</Details>
</ChangesXML>
</AuditTrail>
我需要編寫一個查詢(在SQL Server 2008中),對於源表中的每一行,該查詢將為XML中的EACH Property
元素輸出一行。 因此,如果我查詢上面的記錄,則會得到以下結果集:
UserId Timestamp PropertyName
-------------------------------------------------
1 1-1-2011 00:11:22:11 Document_Type_01
2 1-1-2011 00:11:22:11 Document_Type_02
我的源表如下所示:
UserId Timestamp XML
--------------------------------------
1 1-1-2011 00:11:22:11 <XML>
2 4-1-2011 00:22:33:22 <XML>
3 4-2-2011 00:14:33:22 <XML>
我的第一次嘗試如下所示:
SELECT UserId, Timestamp,
CAST(AuditXml AS XML).value('(/AuditTrail/ChangesXML/Details/Object/Properties/Property/@FieldName)[1]', 'varchar(50)') AS PropertyName
FROM History order by timestamp desc
顯然,這僅在只有一個property元素的情況下有效,並且在源表中每條記錄僅返回一行。 如何編寫此查詢,使其返回我要查找的結果集?
看一下OUTER APPLY
運算符並考慮以下示例:
DECLARE @x XML = '<?xml version="1.0" encoding="UTF-8"?>
<AuditTrail>
<Action />
<ActionDetail />
<ChangesXML>
<Details>
<Object ObjectType="Data.Review_Extension" AuditType="Modified" FriendlyName="Review">
<ObjectKeys>
<ReviewExtID>21482283</ReviewExtID>
</ObjectKeys>
<Properties>
<Property name="Document Type 01" FieldName="Document_Type_01" TemplateFieldID="644140" ReviewExtensionID="214822182" PropertyType="System.String">
<OldValue />
<NewValue><![CDATA[1145]]></NewValue>
</Property>
<Property name="Document Type 02" FieldName="Document_Type_02" TemplateFieldID="644141" ReviewExtensionID="21482283" PropertyType="System.String">
<OldValue />
<NewValue><![CDATA[123]]></NewValue>
</Property>
</Properties>
</Object>
</Details>
</ChangesXML>
</AuditTrail>'
DECLARE @t TABLE (userid INT, [xml] XML)
INSERT @t VALUES(1, @x)
SELECT t.userid, r.z.value('@FieldName', 'nvarchar(MAX)')
FROM @t t
OUTER APPLY t.xml.nodes('//Property') as r(z)
希望能幫助到你
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.