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

SQL XML Check if at-least one of node has value

我正在编写一个存储过程,我需要检查其中一个 XML 字段 "EmployeeId" 是否具有值。它应该 return 在 xml 个节点中找到的第一个值。例如,在下面的示例中,它应该 return 值为 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>

在上面的结构中,查询应该return值为19的节点。

鉴于你的示例,我在 SQL Server 2014 中使用了它,它返回了 19 的值,我只是选择了前 1 个结果,如果 xml 节点为空且有价值输入 INT 似乎 SQL 服务器将其转换为 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

只需使用正确的 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')