在库存ELMAH_Error表使用一个n文字字段来存储错误条目。我发现,通过添加XML类型的字段;然后添加这一新领域,以用于填充字段中存储过程的INSERT语句;我可以更好地利用ELMAH输出的。

现在我想的是XML领域内如何学习查询特定元素的值。该文件的结构为:

<error [...]>
  <serverVariables>
    <item name="ALL_HTTP">
      <value string="..." />
    </item>
    <item name="ALL_RAW">
      <value string="..." />
    </item>
    .
    .
    .
  </serverVariables>
</error>

我需要能够查询下方的特定项目的值。

所以我期待在从 15seconds.com 文章的例子:

SELECT MyXml.value('(/root/product[@id="304"]/name)[1]', 'nvarchar(30)')

,我试图映射这些值来我场的结构 - 但不能。 E.g。

select top 10 RealXML.value('(/error/serverVariables[@id="REMOTE_HOST"]/name)[0]', 'nvarchar(30)') 

其中REMOTE_HOST被格式化:

<item name="REMOTE_HOST">
  <value string="55.55.55.55" />
</item>

非常感谢

有帮助吗?

解决方案

此应该工作:

select top 10 RealXML.value('(/error/serverVariables/item[@name="REMOTE_HOST"]/value/@string)[1]', 'nvarchar(30)') 

使用以下测试:

DECLARE @xml XML  = '
<error>
  <serverVariables>
    <item name="ALL_HTTP">
      <value string="..." />
    </item>
    <item name="ALL_RAW">
      <value string="..." />
    </item>
<item name="REMOTE_HOST">
  <value string="55.55.55.55" />
</item>
  </serverVariables>
</error>
'
SELECT @xml.value('(/error/serverVariables/item[@name="REMOTE_HOST"]/value/@string)[1]','nvarchar(30)') 
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top