【问题标题】:SQL : Find if XML node existsSQL:查找 XML 节点是否存在
【发布时间】:2015-03-13 06:20:39
【问题描述】:

假设我有一个表格数据如下:

我想选择包含节点Name="Hello World" 的所有Value(XML 数据)。我怎样才能实现它?

SQL Fiddle

set @f = @XML.exist('/ArrayOfFilterColumn/SelectColumn[(@Name) eq "Hello World"]');
select @f;

我不确定如何将它添加到我的 where 条件中,所以我把它放在了一个小提琴中。

【问题讨论】:

    标签: sql sql-server tsql sqlxml


    【解决方案1】:

    在查询表时跳过 XML 变量的使用,并将存在放在 where 子句中。

    select F.Value
    from XML_FILES as F
    where F.Value.exist('/ArrayOfArrayOfSelectColumn/SelectColumn[@Name eq "Hello World"]') = 1
    

    您的专栏显然是 text,因此您需要更改它,因为 text 已被弃用并且已经有一段时间了。

    ntext, text, and image (Transact-SQL)

    ntext 、 text 和 image 数据类型将在未来版本中删除 的 Microsoft SQL Server。避免在 new 中使用这些数据类型 开发工作,并计划修改当前使用的应用程序 他们。请改用 nvarchar(max)、varchar(max) 和 varbinary(max)。

    在您的情况下,您当然应该改为使用 XML。

    在您修复可以在查询中转换为 XML 之前。

    select F.Value
    from XML_FILES as F
    where cast(F.Value as xml).exist('/ArrayOfArrayOfSelectColumn/SelectColumn[@Name eq "Hello World"]') = 1
    

    【讨论】:

    • 我的列值是text 类型。所以它给我一个错误Cannot call methods on text.我的错误就像我在小提琴中提到的类型XML
    • @Gun.IO 你在小提琴中使用 XML 列欺骗了我。
    • 我的错误。道歉!
    • 为了后代 - Mikael 的回答是正确的。但是我确实想提一下,您不应该对答案的“.Value”部分感到困惑,因为 XML 函数 .value 不是这里所说的。相反,我们正在检查是否存在节点的列的名称称为“值”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    • 2016-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多