2

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>
4

2 に答える 2

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)

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の回答のほとんどの部分を使用しているため、主に真実であるため、この理由でのみ反対票を喜んで受け入れることをお知らせします

于 2012-04-04T22:45:29.883 に答える
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'
于 2012-04-04T22:18:32.403 に答える