【问题标题】:SQL Server Where Clause Path for XML ValueXML 值的 SQL Server Where 子句路径
【发布时间】:2019-11-26 20:54:06
【问题描述】:

主要问题是如何在 SQL for XML 中使用where 子句。

我需要返回出现“团队”的 XML 行。

你可以在这里查看我的小提琴示例:http://sqlfiddle.com/#!18/de221e/2

表:

CREATE TABLE test
(
  id int,
  value xml
  )

  INSERT INTO test (id, value)
  VALUES 
  ('1', N'<?xml version="1.0" encoding="utf-16" standalone="yes"?> <Atts>
        <Att>
            <Name>test</Name>
        </Att>
                <Att>
            <Name>team</Name>
        </Att>
                <Att>
            <Name>test</Name>
        </Att>
        </Atts>'),
          ('2', N'<?xml version="1.0" encoding="utf-16" standalone="yes"?> <Atts>
        <Att>
            <Name>test</Name>
        </Att>
                <Att>
            <Name>test</Name>
        </Att>
                <Att>
            <Name>test</Name>
        </Att>
        </Atts>');

查询:

select * from test
where value.value('(/Atts/Att/Name)[1]','varchar(max)') = 'team'

这不会返回任何东西。

但是,如果您对出现在 XML 中的名字执行 where 子句,它会起作用,例如

select * from test
where value.value('(/Atts/Att/Name)[1]','varchar(max)') = 'test'

返回:

| id |                                                                                             value |
|----|---------------------------------------------------------------------------------------------------|
|  1 | <Atts><Att><Name>test</Name></Att><Att><Name>team</Name></Att><Att><Name>test</Name></Att></Atts> |
|  2 | <Atts><Att><Name>test</Name></Att><Att><Name>test</Name></Att><Att><Name>test</Name></Att></Atts> |

预期结果是这个查询应该返回:

select * from test
where value.value('(/Atts/Att/Name)[1]','varchar(max)') = 'team'

| id |                                                                                             value |
|----|---------------------------------------------------------------------------------------------------|
|  1 | <Atts><Att><Name>test</Name></Att><Att><Name>team</Name></Att><Att><Name>test</Name></Att></Atts> |

如果“团队”出现在 XML 中但不在第一个中,我如何返回它的任何想法

【问题讨论】:

    标签: sql sql-server xml


    【解决方案1】:

    最好使用exist() 方法。无论其位置如何,它都会检查“团队”值。 exist() Method (xml Data Type)

    SQL

    select * from test
    where value.exist('/Atts/Att/Name[./text()="team"]') = 1;
    

    【讨论】:

      【解决方案2】:

      这是第二个。您正在查看第一个。

      这会给你想要的结果

      select * from test
      where value.value('(/Atts/Att/Name)[2]','varchar(max)') = 'team'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-13
        • 2015-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-09
        相关资源
        最近更新 更多