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