2017-07-31 77 views
0

我到處搜索過,似乎遇到了針對特定問題的麻煩。我試圖從我們的數據庫中解析xml值。該表名爲'Table.XMLfileData',帶有一列XMLData。該列的當前設置是這樣的:針對屬性值的SQL查詢

XML Data with Column Names

XML本身都嵌套在屬性的設置:

XML example

我希望能拉到任何一件數據從每個這些XML文件中取出。在我的研究中發現的查詢應該是這樣的:

SELECT r.value('@first_name','varchar(60)') 
    FROM TableName 
CROSS APPLY columnname.nodes('Vehicle_Loan/Applicants/Applicant/first_name') AS 
x(r) 

但是,我每次都檢索一個空值或空值。我對此很陌生,我做錯了什麼?

+0

您的XPath是錯在沒有'.nodes(...)'和'.value(...)' –

回答

1

.value(...)需要單個節點才能使用並且XPath區分大小寫

SELECT r.value('(./@first_name)[1]','varchar(60)') 
    FROM TableName 
CROSS APPLY columnname.nodes('Vehicle_Loan/Applicants/Applicant') AS 
x(r) 

...工作示例...

DECLARE @xml XML = N' 
<Vehicle_Loan> 
    <Applicants> 
     <Applicant first_name="Matt" /> 
     <Applicant first_name="Jim" /> 
    </Applicants> 
</Vehicle_Loan> 
'; 

SELECT r.value('(./@first_name)[1]','varchar(60)') AS [FirstName] 
    FROM @xml.nodes('Vehicle_Loan/Applicants/Applicant') AS x(r) 

... ...輸出

FirstName 
--------------- 
Matt 
Jim 
+0

嗨馬特,謝謝你回答我的問題和快速回復。使用這個例子,我能夠很好地拉馬特,但我有多行XML數據。因此,例如,我想拉我的XML的每一行的名字。此方法是否會通過每個XML文件進行搜索,並在select語句中提取我指向的信息? –

+0

如果您仍然在桌子的柱子上使用「CROSS APPLY」,那麼是的。 '.value(...)'在通過的XML節點上工作,在你的情況下,它將是'Applicant'元素。 –

+0

非常感謝您的幫助。我能夠獲得我需要的信息。還有一個問題,如果我有帶不同父節點的XML列......例如'Vehicle_Loan/Applicants/Applicant'......我可能有另一種類型的貸款,其中節點可能會'Credit_Card/Applicants /申請人'。有沒有一種方法用xquery來設置頂級節點的變化,或者我在查看中引入「NOT NULL」? –