在SQL Server中将XML元素选择到表行中
我在一个表中的一行中有如下XML,表中有许多行:在SQL Server中将XML元素选择到表行中,sql,xml,tsql,xpath,xquery,Sql,Xml,Tsql,Xpath,Xquery,我在一个表中的一行中有如下XML,表中有许多行: <?xml version="1.0" encoding="UTF-8"?> <AuditTrail> <Action /> <ActionDetail /> <ChangesXML> <Details> <Object ObjectType="Data.Review_Extension" AuditType="Modif
<?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>
我的源表如下所示:
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
显然,只有当源表中有一个属性元素并且每个记录只返回一行时,这种方法才有效。我如何编写这个查询,使它返回我正在寻找的结果集?查看外部应用运算符,并考虑这个例子:
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)
希望它有助于 查看外部应用运算符,并考虑这个例子:
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)
希望有帮助这正是我想要的。唯一的问题是,在这个查询中,我可以在[xml]节点上调用CAST吗?在我的SQL模式中,这实际上是一个ntext字段。这里回答了这个问题:这正是我想要的。唯一的问题是,在这个查询中,我可以在[xml]节点上调用CAST吗?在我的SQL模式中,这实际上是一个ntext字段。这里回答了这个问题: