【问题标题】:Reading node value using condition in SQL server在 SQL Server 中使用条件读取节点值
【发布时间】:2025-12-30 02:05:13
【问题描述】:

我有以下 XML,我的表名是 table1

<Details >
  <RelatedDetails>   
    <Name>name 1</Name>   
    <Position>User</Position>    
    <Relationship>User</Relationship>
    <Salary>5000</Salary>
    <Type>Company</Type>
  </RelatedDetails>
  <RelatedDetails>   
    <Name>name 2</Name>   
    <Position>User</Position>    
    <Relationship>Owner</Relationship>
    <Salary>7000</Salary>
    <Type>Company</Type>
  </RelatedDetails>
  <RelatedDetails>   
    <Name>name 3</Name>   
    <Position>User</Position>    
    <Relationship>Director</Relationship>
    <Salary>2000</Salary>
    <Type>Company</Type>
  </RelatedDetails>
</Details>

我想在 SQL Server 中获取 Salary > 6000 的 'name' 的值。

请建议如何实现?

理想情况下,我应该得到 'name 2' 作为输出。

【问题讨论】:

  • 问题是,我的列不是 xml 列我有 nvarchar 列,我正在尝试使用 cast 将列转换为 xml,但没有得到任何结果
  • 在提出问题时,您需要提供一个可重现的最小示例。请参考以下链接:*.com/help/minimal-reproducible-example 请提供以下内容: (1) DDL 和样本数据填充,即 CREATE table(s) 加上 INSERT T-SQL 语句。 (2) 你需要做什么,即逻辑和你的代码尝试实现它。 (3) 期望的输出,基于上面#1 中的样本数据。 (4) 你的 SQL Server 版本 (SELECT @@version;)
  • @kawade,还有一个问题。存储在 MVARCHAR() 列中的 XML 是否具有指定编码的 XML 序言声明?

标签: sql-server xml


【解决方案1】:

这应该做你想做的:

DECLARE @Table1 TABLE ( xmlText NVARCHAR(MAX) );
INSERT INTO @Table1 VALUES ( '<Details><RelatedDetails><Name>name 1</Name><Position>User</Position><Relationship>User</Relationship><Salary>5000</Salary><Type>Company</Type></RelatedDetails><RelatedDetails><Name>name 2</Name><Position>User</Position><Relationship>Owner</Relationship><Salary>7000</Salary><Type>Company</Type></RelatedDetails><RelatedDetails><Name>name 3</Name><Position>User</Position><Relationship>Director</Relationship><Salary>2000</Salary><Type>Company</Type></RelatedDetails></Details>' );

DECLARE @salary INT = 6000;

SELECT
    n.f.value( '../Name[1]', 'VARCHAR(50)' ) AS [Name]
FROM @Table1 t1
CROSS APPLY ( SELECT CAST( xmlText AS XML ) AS xt ) AS x
CROSS APPLY x.xt.nodes( '//Details/RelatedDetails/Salary[.>sql:variable("@salary")]' ) n(f);

返回

+--------+
|  Name  |
+--------+
| name 2 |
+--------+

【讨论】: