2014-05-25 52 views
0

的SQL Server希望這是一個容易爲專家:)碎紙XML從NTEXT

我有一個包含XML(在這個崗位的底部)列 - 列是ntext數據類型。 而不是在一列中顯示整個XML字符串,我想將它分成多列。數據庫是SQL Server 2008 R2。列數據類型不能更改(MS應用程序數據庫)

我已經嘗試了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 

在所有這一切,我想打出服務器名稱,保護組,數據源名稱末尾。

任何關於我哪裏出錯的指針都會被大量讚賞。

在此先感謝

+4

一般來說,在XPath中,您可以使用'@ attributeName'來選擇XML屬性。試試這個XPath:'/ q1:ErrorInfo/q1:Parameter [6]/@ Value' – har07

+0

除非你確實對*第六個參數的值感興趣,而不是與* protectedgroup *有關的值,你應該使用:'/Q1:ERRORINFO/Q1:參數[@名稱= 'protectedgroup']/@ Value'。 –

+0

魔法!這兩項工作都非常成功,而且我很難判斷答案的答案。我決定使用har07的第一個答案,儘管使用Marcus的答案對其他人閱讀我的腳本會更好 - 在我的情況下,對於任何人來說,理解我想要達到的目標並不重要。感謝你們的時間和知識。 – user3346030

回答

0

一般來說,XPATH使用@attributeName選擇XML屬性,你可以試試這個方法:

/q1:ErrorInfo/q1:Parameter[6]/@Value 
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], 

...

感謝負荷再次 - 救了我這麼多時間和理智!

+0

將我的評論轉換爲答案,以便您可以標記它。雖然我在SQL部分沒有經驗,所以我認爲這個答案也是有用的 – har07