【问题标题】:How to select/query xml data from element and selecting sibling value in SQL如何从元素中选择/查询 xml 数据并在 SQL 中选择同级值
【发布时间】:2020-06-04 13:39:04
【问题描述】:

例如,我有一个名为 t 的 SQL Server 表,它有 2 列和很多行

  • ID(PK,int,非空)
  • 数据(XML(.),非空)

在数据字段中我有这个 XML(我不能改变它的格式)

<ArrayOfDataAttribute xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<DataAttribute>
    <Name>field1</Name>
    <Value>default-value-example</Value>
</DataAttribute>
<DataAttribute>
    <Name>field2</Name>
</DataAttribute>
<DataAttribute>
    <Name>field5</Name>
    <Value>False</Value>
</DataAttribute>
<DataAttribute>
    <Name>field4</Name>
    <Value>example value</Value>
</DataAttribute>
<DataAttribute>
    <Name>field5</Name>
    <Value>another value</Value>
</DataAttribute>
</ArrayOfDataAttribute>

我需要从 t 返回兄弟 xml 项目名称的 ID 和内容,其中它等于 field4 或 null/空字符串(如果该行不存在)。

所以如果只有一行,我会这样结束

标识 |字段4

1 |示例值

从在线阅读看来,使用“节点”是一种方法,但我没有得到任何结果,我在网上找到的示例似乎是人们正在寻找特定价值的地方。这是我得到的最接近的:

SELECT  T2.Loc.value('.', 'varchar(max)') 
FROM   t  
CROSS APPLY t.Data.nodes('/*:ArrayOfDataAttribute/*:DataAttribute/Name') as T2(Loc)  

感谢任何帮助

非常感谢 理查德

【问题讨论】:

    标签: sql-server xml tsql xquery


    【解决方案1】:

    您正在寻找的是一个XQuery 谓词以及如何将值填充到您的XQuery 中。第一个需要括号([]),第二个可以用sql:variable()函数实现:

    试试这样:

    DECLARE @YourTable TABLE(ID INT IDENTITY,[Data] XML);
    INSERT INTO @YourTable VALUES
    (N'<ArrayOfDataAttribute xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <DataAttribute>
        <Name>field1</Name>
        <Value>default-value-example</Value>
    </DataAttribute>
    <DataAttribute>
        <Name>field2</Name>
    </DataAttribute>
    <DataAttribute>
        <Name>field5</Name>
        <Value>False</Value>
    </DataAttribute>
    <DataAttribute>
        <Name>field4</Name>
        <Value>example value</Value>
    </DataAttribute>
    <DataAttribute>
        <Name>field5</Name>
        <Value>another value</Value>
    </DataAttribute>
    </ArrayOfDataAttribute>');
    

    --搜索字符串的参数

    DECLARE @searchFor NVARCHAR(MAX)=N'field4'
    

    --查询

    SELECT t.ID
          ,t.[Data].value(N'(/ArrayOfDataAttribute
                             /DataAttribute[(Name/text())[1]=sql:variable("@searchFor")]
                             /Value
                             /text())[1]',N'nvarchar(max)') AS field4
    FROM @YourTable t;
    

    XPath 可以读作:

    深入属性数组 并查找&lt;DataAttribute&gt; 与给定值的&lt;Name&gt;。我们需要Value 中的text()

    提示:虽然有命名空间,但给定的示例没有使用它们中的任何一个。在这种情况下,我们可以省略声明...

    【讨论】:

      猜你喜欢
      • 2011-03-22
      • 2021-12-14
      • 2015-08-18
      • 2019-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多