2017-07-31 82 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”? –