【问题标题】:Query to output content of AllXml column of ELMAH_Error sql server table查询ELMAH_Error sql server表的AllXml列的输出内容
【发布时间】:2012-04-04 21:29:30
【问题描述】:

我在编写查询时遇到问题,因此我可以查询 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>

【问题讨论】:

    标签: asp.net sql-server xml elmah


    【解决方案1】:

    远程地址节点

    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)
    

    包含 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%'
    

    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)
    



    在否决这个答案之前,因为使用了 Mikael Eriksson 答案的大部分内容,我让你知道我会很乐意接受这个原因,因为是主要是真的

    【讨论】:

    • 如何获取 AllXml 列中所有项目和值的列表?
    • 查看我的更新。我还删除了前 10 个子句,因为我有一个巨大的 elmah 表并且需要一段时间来测试它..
    • 感谢阿德里安...如何按 Elmah 表中的特定错误进行过滤...即 ErrorID?...
    • 欢迎,按 ID 很简单,甚至是 GUID,您可以像放置任何其他字符串一样放置 guid
    • 我想通过 ErrorID 过滤“所有标签 + 值”结果。请告诉我。谢谢您的帮助
    【解决方案2】:

    此查询将为您提供所有 item 节点

    select T.N.value('@name', 'varchar(30)') as Name,
           T.N.value('(value/@string)[1]', 'varchar(30)') as Value
    from Elmah_Error
      cross apply AllXml.nodes('/error/serverVariables/item') as T(N)
    

    如果您想过滤任何值,您可以将其放在子查询中应用常规 where 子句。

    select Name, 
           Value
    from
      (
        select T.N.value('@name', 'varchar(30)') as Name,
               T.N.value('(value/@string)[1]', 'varchar(30)') as Value
        from Elmah_Error
          cross apply AllXml.nodes('/error/serverVariables/item') as T(N)
      ) T
    where Name = 'ALL_HTTP'
    

    【讨论】:

    • Elmah 表唯一的问题是 AllXml 列不是 xml 类型的,所以需要强制转换
    • Mikael,当我运行您的查询时,我收到以下错误... XMLDT 方法“节点”只能在 xml 类型的列上调用。我注意到 AllXml 列的类型为 ntext。请帮助我..谢谢
    • @dotnet-practitioner,您需要将其转换为 xml,Mikael Eriksson 可能会向您展示如何
    • 我正在尝试,但到目前为止没有运气。
    • @dotnet-practitioner - 时区问题和良好的睡眠妨碍了使用来自varcharcast 更新答案。但我看到你现在已经解决了。
    猜你喜欢
    • 1970-01-01
    • 2019-06-10
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    • 2015-12-25
    • 1970-01-01
    • 2015-03-02
    • 1970-01-01
    相关资源
    最近更新 更多