【发布时间】:2018-03-09 15:33:56
【问题描述】:
SQL Server 2016
Field1 (XML(.), null)
示例数据:
<ProcessPositionOpening xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.hr-xml.org/3">
<ApplicationArea xmlns="http://www.openapplications.org/oagis/9">
...
</ApplicationArea>
<DataArea>
<Process xmlns="http://www.openapplications.org/oagis/9">
...
</Process>
<PositionOpening>
<DocumentID />
<PositionRequester>
...
</PositionRequester>
<PositionProfile>
...
<PositionFormattedDescription>
<ID>...</ID>
<Content />
</PositionFormattedDescription>
...
</PositionProfile>
</PositionOpening>
</DataArea>
</ProcessPositionOpening>
在此表中,Field1 设置为 XML,我一直在尝试查找节点 Content 可能不为 NULL 的所有记录。但是,我尝试了 query 和 exist 的不同示例,但似乎无法正确查询。这是我正在尝试的当前一个,但它没有返回我所期望的:
SELECT *
FROM Table1
WHERE Field1.value('(/ProcessPositionOpening/DataArea/PositionOpening/PositionProfile/PositionFormattedDescription/Content)[1]','varchar(50)') <> ''
AND Message = 'Request Received';
我也试过了:
SELECT *
FROM Table1
WHERE Message = 'Request Received'
AND Field1.exist('/ProcessPositionOpening') = 1;
我尝试了上面的查询,只是想看看查询的基本设置是否可行。它不返回任何记录。如果我删除查询的AND 部分,我在这个表中有超过 19,000 行都是这种格式的。如果我在查询的AND 部分将1 更改为0,它会返回记录,但我觉得这是错误的(基于解释exist 函数的页面,0 表示不存在) .所以,我很困惑。
我想找到Content 节点有值的所有记录,同样找到Content 没有值的所有记录。任何帮助都非常感谢。谢谢!
【问题讨论】:
-
提示:你的 XML 有命名空间。更糟糕的是:有不同的 default 命名空间。您可以正确声明它们(阅读
WITH XMLNAMESPACES),也可以使用通配符(/*:root/*:content)省略它们... -
@Shnugo - 这似乎奏效了。我正在尝试使用您的答案,但仍然没有得到任何结果。在文本中添加
*:即可。
标签: sql sql-server xml sqlxml