我在 SQL Server 2008 数据库中有一个 XML 列,其值类似于以下简化示例:
情况1
<root>
<child>sometimes text here</child>
<otherstuff ..... />
</root>
案例2
<root>
<child/>
<otherstuff ..... />
</root>
给定一个字符串值,我希望能够选择在“子”节点中具有特定值的行,包括选择案例 2。
例如,如果我有一个局部变量:
declare @queryText nvarchar(MAX)
select @queryText = 'sometimes text here'
我可以通过以下方式选择与案例 1 匹配的行:
select * from [my_table]
where [my_xml_column].exist('/root/child[text()=sql:variable("@queryText")]') = 1
但是,对于案例 2,我希望 @queryText = '' 或 @queryText = NULL 能够工作,两者都不匹配。
作为一种解决方法,我可以使用:
select * from [my_table]
where [my_xml_column].value('(/root/child)[1], 'nvarchar(MAX)') = @queryText
这可行,但它让我觉得我错过了一些东西并使用肮脏的解决方法来测试是否存在 .value() 而不是 .exist()... 是否有类似的表达式我可以[并且应该?]使用在 .exist() 中匹配特定文本或空节点?除了可读性之外,还有什么理由关心吗?当有人指出我错过的任何明显明显的事情时,我期待着我即将到来的掌心。:)