2014-09-04 87 views
2

是否可以通过匹配部分XML来过滤XML列?通过部分XML过滤SQL XML列

例子:

我给定记录XML列可能有:

<element1> 
    <subelement1>value1</subelement1> 
    <subelement2>value2</subelement2> 
    <subelement3>value3</subelement3> 
</element1> 

,我不得不使用下面的部分XML作为过滤器:

<element1> 
    <subelement2>value2</subelement2> 
    <subelement3>value3</subelement3> 
</element1> 

在这大小写,因为这两个元素及其值都与记录中的元素相匹配,所以它应该返回记录。

然而,在下面的部分XML,它不是一个比赛,因为subelement4不存在XML列该定记录:

<element1> 
    <subelement2>value2</subelement2> 
    <subelement4>value4</subelement4> 
</element1> 

在同一行,什么是滤波的推荐方法XML列使用多个元素?我看到的例子总是过滤一个元素,而不是多个元素。

我目前的解决方案是一个逗号分隔值的字符串,我分裂成一个2列(元素名称和值)的表和交叉应用。它运作良好。我只是想知道是否有更好的东西。我正在考虑发送部分XML字符串,并以某种方式(此问题)将此部分XML与XML列匹配。

+0

您能解释为什么第一个XML匹配,但第三个不匹配?两者都包含过滤器中不存在的元素。也许你的意思是“包含过滤器中所有元素的XML,并在过滤器中匹配它们的值,应该返回”? – 2014-09-04 22:00:31

+0

@ZoffDino谢谢,我编辑。是的,价值也应该被考虑,而不仅仅是元素名称。没有第三。第一个XML是数据库中的一个。第二个是作为匹配的XML过滤器(示例)。第三个是XML过滤器不匹配(示例)。 – igorjrr 2014-09-04 23:14:03

回答

0

我不完全清楚你想要做什么。我认为下面的代码给了你一些指导。如果你能澄清你的问题,我可以尝试更彻底。

declare @x1 [xml] =N'<element1> 
<subelement1>value1</subelement1> 
<subelement2>value2</subelement2> 
<subelement3>value3</subelement3> 
</element1>' 
    , @x2 [xml] = N'<element1> 
<subelement2>value2</subelement2> 
<subelement3>value3</subelement3> 
</element1>' 
    , @x3 [xml] = N'<element1> 
<subelement2>value2</subelement2> 
<subelement4>value4</subelement4> 
</element1>'; 
-- 
select t.c.query(N'.') 
    , t.c.value(N'(./text())[1]' 
       , N'[sysname]') 
from @x1.nodes(N'/*/*') as t(c) 
where t.c.value(N'(./text())[1]' 
      , N'[sysname]') = N'value2'; 
-- 
select t.c.query(N'.') 
    , t.c.value(N'(./text())[1]' 
       , N'[sysname]') 
from @x1.nodes(N'/*/*') as t(c) 
where t.c.exist(N'//*[local-name()="subelement4"]') = 1; 
+0

这就是我想要避免的。我不想指定查询中的元素,它们会有所不同。我想使用输入(部分XML)作为过滤器来检索记录,只获取XML列中存在此部分XML中的所有元素及其值的记录。 – igorjrr 2014-09-04 21:25:56

+0

不幸的是,没有办法做到这一点。这也是我偶尔需要做的事情。解决方法是将每个堆栈切成一张表并执行EXCEPT。丑,但它的作品。 – 2014-09-05 12:03:59