我正在编写一个存储过程,我需要检查其中一个XML字段“EmployeeId”是否具有值。它应该返回xml节点中的第一个找到的值。例如,在下面的示例中,它应返回值为19的节点。
@Table NVARCHAR(MAX),
DECLARE @xmlEmployees XML = CAST(@Table AS XML);
以下是xml结构
<Employee>
<EmployeeId></EmployeeId>
</Employee>
<Employee>
<EmployeeId></EmployeeId>
</Employee>
<Employee>
<EmployeeId>19</EmployeeId>
</Employee>
<Employee>
<EmployeeId>21</EmployeeId>
</Employee>
在上面的结构中,查询应返回值为19的节点。
答案 0 :(得分:2)
只需使用正确的XPath表达式:
DECLARE @xmlEmployees XML = '<Employee>
<EmployeeId></EmployeeId>
</Employee>
<Employee>
<EmployeeId></EmployeeId>
</Employee>
<Employee>
<EmployeeId>19</EmployeeId>
</Employee>
<Employee>
<EmployeeId>21</EmployeeId>
</Employee>';
SELECT @xmlEmployees.value('(//EmployeeId[text()])[1]', 'int')
答案 1 :(得分:1)
鉴于你的例子,我在SQL Server 2014中使用了它并返回了值19,我刚刚选择了前1个结果,如果xml节点为空且值为INT,则似乎SQL Server将其转换为0 ,所以我添加了一个WHERE子句来过滤掉前2个条目,因为它们的EmployeeId值等于零:
DECLARE @xDoc XML = '<Employee>
<EmployeeId></EmployeeId>
</Employee>
<Employee>
<EmployeeId></EmployeeId>
</Employee>
<Employee>
<EmployeeId>19</EmployeeId>
</Employee>
<Employee>
<EmployeeId>21</EmployeeId>
</Employee>'
SELECT TOP 1 a.doc.value('EmployeeId[1]', 'INT') AS [EmployeeId]
FROM @xDoc.nodes('/Employee') as a(doc)
WHERE a.doc.value('EmployeeId[1]', 'INT') <> 0