2014-09-04 119 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