我不习惯和
OPENXML
,据我所知,这是从XML文档中检索内容的老派方法。我这样做的方式是使用SQL Server中支持的XML函数。具体来说,XML函数:
-
nodes
nodes()方法的结果是一个行集,其中包含原始XML实例的逻辑副本。在这些逻辑副本中,每个行实例的上下文节点都设置为使用查询表达式标识的节点之一,以便后续查询可以相对于这些上下文节点进行导航。
-
value
对XML执行XQuery并返回SQL类型的值
id
(
<user>
属性Id)您处于错误的级别,必须再深入一步。例如。
<Client>
DECLARE @x XML;
SET @x=N'<ActivityLog repositoryId="ZZ-T6KQ1I1B" repositoryName="Training" startDate="2017-07-01" endDate="2017-09-18">
<activity date="2017-08-08T10:29:02" name="change access list" host="127.0.0.1">
<user id="JS" name="John Smith" memberType="I" />
<storageObject docId="4161-1264-9996" name="Hello World" size="0" fileExtension="eml">
<cabinet name="Materials">QPIRVQK</cabinet>
</storageObject>
</activity>
<activity date="2017-08-08T10:29:03" name="change access list" host="127.0.0.1">
<user id="JS" name="John Smith" memberType="I" />
<storageObject docId="4161-1264-9996" name="Screen Shot" size="0" fileExtension="jpg">
<cabinet name="Materials">QPIRVQK</cabinet>
<Client>1011</Client>
<Matter>007</Matter>
<Author>EMAIL</Author>
<DocumentType>JPG</DocumentType>
</storageObject>
</activity>
</ActivityLog>';
SELECT
activitydate=n.v.value('../../@date','DATETIME'),
activityname=n.v.value('../../@name','NVARCHAR(MAX)'),
host=n.v.value('../../@name','NVARCHAR(32)'),
id=n.v.value('../../user[1]/@id','NVARCHAR(32)'),
username=n.v.value('../../user[1]/@name','NVARCHAR(MAX)'),
memberType=n.v.value('../../user[1]/@memberType','NVARCHAR(50)'),
docId=n.v.value('../@docId','NVARCHAR(50)'),
filename=n.v.value('../@filename','NVARCHAR(MAX)'),
size=n.v.value('../@size','INT'),
fileExtension=n.v.value('../@fileExtension','NVARCHAR(MAX)'),
cabinetname=n.v.value('@cabinetname','NVARCHAR(MAX)'),
Client=n.v.value('../Client[1]','NVARCHAR(MAX)'),
Matter=n.v.value('../Matter[1]','NVARCHAR(MAX)'),
Author=n.v.value('../Author[1]','NVARCHAR(MAX)'),
DocumentType=n.v.value('../DocumentType[1]','NVARCHAR(MAX)')
FROM
@x.nodes('ActivityLog/activity/storageObject/cabinet') AS n(v);