XML:(假设XMLNAMESPACES已经设置为a和b)
<Layer1 xmlns="a">
<Layer2 xmlns="b">
<Layer3>
<id>val1</id>
<data>False</data>
</Layer3>
<Layer3>
<id>val2</id>
<data>True</data>
</Layer3>
</Layer2>
</Layer1>我正在使用这个sql来尝试完成我的任务。
ITEM.value('(/a:Layer1/b:Layer2/b:Layer3)[1]', 'varchar(max)') AS ReturnValue我要做的是只得到id='val2‘和data=' true’的真值。就像这样:
ITEM.value('(/a:Layer1/b:Layer2/b:Layer3[id="val2" and data="True"]/b:data)[0]', 'varchar(max)') AS ReturnValue由于某种原因,上面的内容返回null。我认为这是语法错误。
在这个查询中,我希望从id和数据遵循条件的任何Layer3父节点以True的形式返回值。我很感谢您的帮助,并在此之前感谢您。
发布于 2017-06-13 16:55:22
从你的代码来看,这是Server.
您的XML为第一个节点定义了默认名称空间,为<Layer2>再次定义了一个默认名称空间。
这意味着,<Layer2>下面的所有元素都在这个新的默认名称空间中。
您的代码忽略了这里的名称空间( [id="val2" and data="True"] ),但我不太明白您到底想要实现什么.
DECLARE @ITEM XML=
N'<Layer1 xmlns="a">
<Layer2 xmlns="b">
<Layer3>
<id>val1</id>
<data>False</data>
</Layer3>
<Layer3>
<id>val2</id>
<data>True</data>
</Layer3>
</Layer2>
</Layer1>';-此查询将在<data>中的<Layer3>下面找到"True“值,其中<id>为"val2":
WITH XMLNAMESPACES('a' AS a,'b' AS b)
SELECT @ITEM.value('(/a:Layer1/b:Layer2/b:Layer3[b:id="val2"]/b:data/text())[1]', 'varchar(max)');您可以在每个名称之前使用一个*:来使用名称空间通配符:
SELECT @ITEM.value('(/*:Layer1/*:Layer2/*:Layer3[*:id="val2"]/*:data/text())[1]', 'varchar(max)');另一种方法是像这样定义内部默认ns,这样可以节省一些输入:
WITH XMLNAMESPACES('a' AS a, DEFAULT 'b')
SELECT @ITEM.value('(/a:Layer1/Layer2/Layer3[id="val2"]/data/text())[1]', 'varchar(max)');https://stackoverflow.com/questions/44527254
复制相似问题