繁体   English   中英

使用SQL查询XML事件日志数据

[英]Query XML Event Log Data using SQL

<Events>
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
<System>
<Provider Name="ASP.NET 4.0.30319.0" />
<EventID Qualifiers="32768">1309</EventID>
<Level>3</Level>
<Task>3</Task>
<Keywords>0x80000000000000</Keywords>
<TimeCreated SystemTime="2014-10-10T01:37:16.000000000Z" />
<EventRecordID>14870</EventRecordID>
<Channel>Application</Channel>
<ComputerXXXXX</Computer>
<Security />
</System>
<EventData>
<Data>3005</Data>
<Data>An unhandled exception has occurred.</Data>
<Data>10/10/2014 02:37:16</Data>
<Data>10/10/2014 01:37:16</Data>
<Data>f68c3bc5c6594c02bf13a5a99a0627a3</Data>
<Data>8138</Data>
<Data>15</Data>
<Data>0</Data>
<Data>/LM/W3SVC/3/ROOT-1-XXXXXX</Data>
<Data>Full</Data>
<Data>/</Data>
<Data>C:\Web\XXXXX\</Data>
<Data>XXXXX</Data>
<Data />
<Data>31428</Data>
<Data>w3wp.exe</Data>
<Data>Domain\User</Data>
<Data>HttpException</Data>
<Data>Exception of type 'System.Web.HttpException' was thrown.
at System.Web.Handlers.TraceHandler.System.Web.IHttpHandler.ProcessRequest(HttpContext context)
at etc
</Data>
<Data>http://XXX/trace.axd</Data>
<Data>/trace.axd</Data>
<Data>XXX.XXX.XX.XX</Data>
<Data />
<Data>False</Data>
<Data />
<Data>XXXXX</Data>
<Data>57</Data>
<Data>XXXXXX</Data>
<Data>False</Data>
<Data>   at System.Web.Handlers.TraceHandler.System.Web.IHttpHandler.ProcessRequest(HttpContext context)  at etc

</Data>
 </EventData>
</Event>

...
etc
</Events>

我已将一些Windows事件日志保存为XML,并已使用以下方法将其插入到SQL中:

CREATE TABLE XmlSourceTable
(
      RecordId INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
      XmlData XML NOT NULL
)
GO

INSERT INTO XmlSourceTable(XmlData)
SELECT
    * 
FROM OPENROWSET (BULK 'C:\xmlfile.xml', SINGLE_CLOB) 
AS XMLData

我正在尝试使用以下方法查询XML,但根本无法使其工作。

SELECT
      WEvent.query('System') as SystemFragmentXML
FROM   
      XmlSourceTable CROSS APPLY 
      XmlData.nodes('/Events/Event') AS WindowsEvent(WEvent)

谁能帮我吗?

您的XML具有在<Event>节点级别声明的默认名称空间。 因此,基本上该节点及其所有后代都位于同一名称空间中。

您需要注册一个指向默认名称空间的前缀,并在XPath中使用该前缀,例如:

;WITH XMLNAMESPACES('http://schemas.microsoft.com/win/2004/08/events/event' as d)
SELECT
      WEvent.query('d:System') as SystemFragmentXML
FROM   
      XmlSourceTable CROSS APPLY 
      XmlData.nodes('/Events/d:Event') AS WindowsEvent(WEvent)

首先,您的XML损坏了-您有几个XML元素(例如<Computer> )没有正确关闭,并且缺少结束符</Events>

解决了这些问题之后,下一个问题是,您会公然忽略在<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">上定义的XML 名称空间。 <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">节点。

尝试以下查询(使用本机XQuery支持而不是旧版OPENROWSET ):

;WITH XMLNAMESPACES ('http://schemas.microsoft.com/win/2004/08/events/event' AS we)
SELECT
      XC.query('we:System') as SystemFragmentXML
FROM  
      dbo.XmlSourceTable  
CROSS APPLY
      XmlData.nodes('/Events/we:Event') AS XT(XC)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM