查询输出ELMAH_Error sql server表的AllXml列的内容

dot*_*ner 2 xml sql-server asp.net elmah

我在编写查询时遇到问题,这样我就可以在Elmah_Error表中查询AllXml列的内容.

如何列出所有项目节点作为查询的输出.我怎么能只查询某些项目节点的查询?

我想得到以下结果集:

项目价值

===== =====

ALL_HTTP HTTP_CONNECTION:xxxx

ALL_RAW连接:xxxxx

我还希望能够通过ErrorID过滤查询

AllXml列的内容可能如下所示.

<error
  application="/"
  message="hello world"
  source="TestWebElmah"
  detail="xxxxx">
  <serverVariables>
    <item
      name="ALL_HTTP">
      <value
        string="HTTP_CONNECTION:xxxx" />
    </item>
    <item
      name="ALL_RAW">
      <value
        string="Connection: xxxxx" />
    </item>

  </serverVariables>
</error>
Run Code Online (Sandbox Code Playgroud)

Adr*_*ode 7

远程地址节点

select T.N.value('(value/@string)[1]', 'varchar(30)') as REMOTE_ADDR
from 
(select cast(AllXml as xml) as AllXml from ELMAH_Error) e
   cross apply AllXml.nodes('//item[@name="REMOTE_ADDR"]') as T(N)
Run Code Online (Sandbox Code Playgroud)

包含mozilla的 HTTP用户代理

select T.N.value('(value/@string)[1]', 'varchar(30)') as HTTP_USER_AGENT
from 
(select cast(AllXml as xml) as AllXml from ELMAH_Error) e
   cross apply AllXml.nodes('//item[@name="HTTP_USER_AGENT"]') as T(N)
where T.N.value('(value/@string)[1]', 'varchar(30)') like '%mozilla%'
Run Code Online (Sandbox Code Playgroud)

Elmah表将AllXml列存储为nvarchar,因此需要将其转换为xml

所有标签+值,按错误ID

select T.N.value('@name', 'varchar(30)') as Name,
       T.N.value('(value/@string)[1]', 'varchar(30)') as Value
from 
(select cast(AllXml as xml) as AllXml from ELMAH_Error where ErrorId = 'DC82172B-F2C0-48CE-8621-A60B702ECF93') e
cross apply AllXml.nodes('/error/serverVariables/item') as T(N)
Run Code Online (Sandbox Code Playgroud)




在对这个答案进行投票之前,因为使用了Mikael Eriksson的答案的大部分内容,我告诉你我只会因为这个原因而高兴地接受downvotes,因为主要是真的