希望这对专家来说很简单:)
我有一个包含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
最后,我想拆分出servername,protected group,datasource name。
关于我出错的地方的任何指示都将受到大力赞赏。
提前致谢
答案 0 :(得分: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],
...
再次感谢负荷 - 为我节省了这么多时间和理智!
答案 1 :(得分:0)
一般来说,在XPath中,您使用@attributeName
来选择XML属性,您可以尝试这种方式:
/q1:ErrorInfo/q1:Parameter[6]/@Value