SQL XML检查至少有一个节点是否有值

时间:2018-02-09 17:53:49

标签: sql sql-server tsql stored-procedures sqlxml

我正在编写一个存储过程,我需要检查其中一个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的节点。

2 个答案:

答案 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