【问题标题】:Shredding XML in SQL Server from NTEXT从 NTEXT 粉碎 SQL Server 中的 XML
【发布时间】:2014-05-25 11:56:50
【问题描述】:

希望这对专家来说是一件容易的事:)

我有一列包含 XML(在这篇文章的底部)——该列是 ntext 数据类型。 我不想在一列中显示整个 XML 字符串,而是将其分解为多个列。数据库是 SQL Server 2008 R2。无法更改列数据类型(MS 应用程序 DB)

我尝试了多种不同的 xpath 查询,但我不断得到空值。希望这只是我引用它的方式是不正确的。任何帮助将不胜感激,因为我似乎无法理解 XML(不是因为缺乏尝试!):

XML(来自结果中的一条记录的示例 - 为了便于阅读,我已将其拆分):

<?xml version="1.0" encoding="utf-16"?>  
<q1:ErrorInfo ErrorCode="1073744938" DetailedCode="0" DetailedSource="0" ExceptionDetails="" xmlns:q1="http://schemas.microsoft.com/2003/dls/GenericAgentStatus.xsd">    
<q1:Parameter Name="datasourceid" Value="48c3db91-4ba9-46a5-820b-a2ab2c0733aa" />    
<q1:Parameter Name="doesalertneedstroubleshootuiformoredetails" Value="False" />    
<q1:Parameter Name="failurecount" Value="1" />    
<q1:Parameter Name="customparameterformom" Value="86924" />    
<q1:Parameter Name="datasourcename" Value="servername\database1" />    
<q1:Parameter Name="protectedgroup" Value="ProtectionGroup1 Servers - servername.domain" />    
<q1:Parameter Name="servername" Value="servername.domain" />  
</q1:ErrorInfo>

我正在使用的 SQL(返回空值):

WITH XMLNAMESPACES('http://schemas.microsoft.com/2003/dls/GenericAgentStatus.xsd' as q1)                        
select cast(ErrorXml as XML).value('(/q1:ErrorInfo/q1:Parameter[6]/q1:value[0]/text())[1]','varchar(MAX)') as [servername]
from
target_table

最后,我想将服务器名、保护组、数据源名分开。

任何关于我哪里出错的指示将不胜感激。

提前致谢

【问题讨论】:

  • 一般来说,在 XPath 中你使用@attributeName 来选择 XML 属性。试试这个 XPath:/q1:ErrorInfo/q1:Parameter[6]/@Value
  • 除非您真的对 sixth 参数的值而不是与 protectedgroup 相关的值真正感兴趣,否则您应该使用:/q1:ErrorInfo/q1:Parameter[@Name='protectedgroup']/@Value
  • 魔术!这两种方法都非常有效,我不知道该把答案授予谁。我决定使用 har07 的第一个答案,尽管使用 Marcus 的答案对于阅读我的脚本的其他人来说会更好——在我的情况下,任何人理解我想要实现的目标并不重要。感谢你们俩的时间和知识。

标签: sql sql-server xml xpath


【解决方案1】:

不幸的是,我似乎无法将评论标记为答案 - 查看 SO 论坛,这是设计使然。感谢这篇文章的两位评论员。

我使用的解决方案来自 har07,但我确实尝试了 Marcus 的解决方案,效果也很好。

我重新编写的代码现在看起来像这样......并且完美运行:

    select cast(ls.ErrorXml as XML).value('(/q1:ErrorInfo/q1:Parameter[6]/@Value)[1]','varchar(MAX)') as [ServerName],
cast(ls.ErrorXml as XML).value('(/q1:ErrorInfo/q1:Parameter[5]/@Value)[1]','varchar(MAX)') as [ProtectedGroup],
cast(ls.ErrorXml as XML).value('(/q1:ErrorInfo/q1:Parameter[4]/@Value)[1]','varchar(MAX)') as [DataSourceName],

...

再次感谢 - 为我节省了很多时间和理智!

【讨论】:

  • 将我的评论转换为回答,以便您标记它。虽然我在 SQL 部分没有经验,所以我认为这个答案在某种程度上也很有用
【解决方案2】:

一般来说,在XPath中你使用@attributeName来选择XML属性,你可以试试这样:

/q1:ErrorInfo/q1:Parameter[6]/@Value

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-02
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    相关资源
    最近更新 更多