如何将 XML 文件(在本例中为业务流程事件日志)导入并查询到 SQL Server Express?
How can I import and query an XML file (in this case, a business process event log) into SQL Server Express?
为了简短起见,我有这个“.xes”(可扩展事件流)文件,它实际上是一个 XML,看起来像这样(此代码仅显示事件示例 -该文件包含多个与此类似的事件):
<?xml version="1.0" encoding="UTF-8" ?>
<log xes.version="1.0" xes.features="nested-attributes" openxes.version="1.0RC7" xmlns="http://www.xes-standard.org/">
<trace>
<string key="concept:name" value="0"/>
<event>
<string key="org:resource" value="Call Centre Agent"/>
<date key="time:timestamp" value="2006-01-01T00:00:00.000+01:00"/>
<string key="concept:name" value="check if sufficient information is available"/>
<string key="lifecycle:transition" value="start"/>
</event>
</trace>
...
这个文件实际上代表了一个业务流程事件日志,其中包含一个流程的不同活动的事件,带有时间戳和更多信息。
我需要从此数据中提取信息并准备一些 SQL 查询。
我目前正在使用 SQL Server 2014 Express 数据库,在导入数据和查询数据时遇到问题。
这是将文件内容放入变量的通用方法:
这是将文件内容放入变量的通用方法:
DECLARE @xml XML=
(SELECT * FROM OPENROWSET(BULK 'C:\YourPath\XMLFile.xml',SINGLE_CLOB) AS x);
SELECT @xml;
由于这是嵌套数据(嵌套级别不明确...)这是我的建议:
DECLARE @log XML=
'<log xmlns="http://www.xes-standard.org/" xes.version="1.0" xes.features="nested-attributes" openxes.version="1.0RC7">
<trace>
<string key="concept:name" value="0" />
<event>
<string key="org:resource" value="Call Centre Agent" />
<date key="time:timestamp" value="2006-01-01T00:00:00.000+01:00" />
<string key="concept:name" value="check if sufficient information is available" />
<string key="lifecycle:transition" value="start" />
</event>
<event>
<string key="second-resouce" value="Call Centre Agent" />
<date key="second:timestamp" value="2006-01-01T00:00:00.000+01:00" />
<string key="second:name" value="check if sufficient information is available" />
<string key="second:transition" value="start" />
</event>
</trace>
</log>';
WITH XMLNAMESPACES(DEFAULT 'http://www.xes-standard.org/')
SELECT TraceNode.value('string[1]/@key','varchar(max)') AS Trace_String_Key
,TraceNode.value('string[1]/@value','int') AS Trace_String_Value
,EventNode.value('date[1]/@key','varchar(max)') AS Trace_Event_Date_Key
,EventNode.value('date[1]/@value','datetime') AS Trace_Event_Date_Value
,EventStringNode.value('@key','varchar(max)') AS Trace_Event_String_Key
,EventStringNode.value('@value','varchar(max)') AS Trace_Event_String_Value
FROM @log.nodes('/log/trace') AS a(TraceNode)
OUTER APPLY TraceNode.nodes('event') AS b(EventNode)
OUTER APPLY EventNode.nodes('string') AS c(EventStringNode)
do you have any suggestions on how, and for what, could I query this
data? Some practical examples would be useful
好吧,这真的取决于你...如果你问这样的问题,你应该知道你需要它做什么:-)
一个想法:
创建关系 table 结构
- Table "Log"(每个日志文件和辅助数据)
- Table "Event"(子数据到 "Log")
- Table "EventData"(子数据到 "Event")
您可以使用查询检索您的数据,将其插入您的 tables...
为了简短起见,我有这个“.xes”(可扩展事件流)文件,它实际上是一个 XML,看起来像这样(此代码仅显示事件示例 -该文件包含多个与此类似的事件):
<?xml version="1.0" encoding="UTF-8" ?>
<log xes.version="1.0" xes.features="nested-attributes" openxes.version="1.0RC7" xmlns="http://www.xes-standard.org/">
<trace>
<string key="concept:name" value="0"/>
<event>
<string key="org:resource" value="Call Centre Agent"/>
<date key="time:timestamp" value="2006-01-01T00:00:00.000+01:00"/>
<string key="concept:name" value="check if sufficient information is available"/>
<string key="lifecycle:transition" value="start"/>
</event>
</trace>
...
这个文件实际上代表了一个业务流程事件日志,其中包含一个流程的不同活动的事件,带有时间戳和更多信息。
我需要从此数据中提取信息并准备一些 SQL 查询。
我目前正在使用 SQL Server 2014 Express 数据库,在导入数据和查询数据时遇到问题。
这是将文件内容放入变量的通用方法: 这是将文件内容放入变量的通用方法:
DECLARE @xml XML=
(SELECT * FROM OPENROWSET(BULK 'C:\YourPath\XMLFile.xml',SINGLE_CLOB) AS x);
SELECT @xml;
由于这是嵌套数据(嵌套级别不明确...)这是我的建议:
DECLARE @log XML=
'<log xmlns="http://www.xes-standard.org/" xes.version="1.0" xes.features="nested-attributes" openxes.version="1.0RC7">
<trace>
<string key="concept:name" value="0" />
<event>
<string key="org:resource" value="Call Centre Agent" />
<date key="time:timestamp" value="2006-01-01T00:00:00.000+01:00" />
<string key="concept:name" value="check if sufficient information is available" />
<string key="lifecycle:transition" value="start" />
</event>
<event>
<string key="second-resouce" value="Call Centre Agent" />
<date key="second:timestamp" value="2006-01-01T00:00:00.000+01:00" />
<string key="second:name" value="check if sufficient information is available" />
<string key="second:transition" value="start" />
</event>
</trace>
</log>';
WITH XMLNAMESPACES(DEFAULT 'http://www.xes-standard.org/')
SELECT TraceNode.value('string[1]/@key','varchar(max)') AS Trace_String_Key
,TraceNode.value('string[1]/@value','int') AS Trace_String_Value
,EventNode.value('date[1]/@key','varchar(max)') AS Trace_Event_Date_Key
,EventNode.value('date[1]/@value','datetime') AS Trace_Event_Date_Value
,EventStringNode.value('@key','varchar(max)') AS Trace_Event_String_Key
,EventStringNode.value('@value','varchar(max)') AS Trace_Event_String_Value
FROM @log.nodes('/log/trace') AS a(TraceNode)
OUTER APPLY TraceNode.nodes('event') AS b(EventNode)
OUTER APPLY EventNode.nodes('string') AS c(EventStringNode)
do you have any suggestions on how, and for what, could I query this data? Some practical examples would be useful
好吧,这真的取决于你...如果你问这样的问题,你应该知道你需要它做什么:-)
一个想法:
创建关系 table 结构
- Table "Log"(每个日志文件和辅助数据)
- Table "Event"(子数据到 "Log")
- Table "EventData"(子数据到 "Event")
您可以使用查询检索您的数据,将其插入您的 tables...