【问题标题】:SQL XML Check if at-least one of node has valueSQL XML 检查至少一个节点是否有值
【发布时间】:2018-02-09 17:53:49
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

  • 谢谢,@salman,这行得通,但是将第一个标记为答案。
  • @ApplicationManager 但这是更好的答案...当前接受的答案将使用.nodes() 获取所有&lt;EmployeeId&gt; 节点的派生表,阅读所有这些节点 并选择第一个。相当多的开销......
【解决方案2】:

鉴于您的示例,我在 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

【讨论】:

    猜你喜欢
    • 2015-09-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多