2012-08-24 212 views
0

我有一個SQL Server 2008的數據庫列,我們將調用xmlDoc中,包含在以下格式的XML:XML SQL查找和替換

<XMLDoc xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.xxx.xxx.xxx"> 
    <Node> 
    <SubNode> 
     <SubSubNode>Value, Value, Value</SubSubNode> 
     <IrrelevantNode></IrrelevantNode> 
    </SubNode> 
    ... 

SubSubNode房子的任何地方從0到20+值用逗號隔開。單個值不應包含逗號,但不正確地輸入它們。例如,下面的SubSubNode是正確的:

<SubSubNode>Value, Value, Value</SubSubNode>

以下SubSubNode是不正確的:

<SubSubNode>Value, </SubSubNode>

我需要找到並用逗號出現代替單一數值的所有實例:

<SubSubNode>Value</SubSubNode>

因爲SQL不允許ends-withstarts-with,或matches,我只能夠想出以下(這是隻搜索的價值,我沒有對更換工作尚未):

with xmlnamespaces(default 'http://schemas.xxx.xxx.xxx') 
select [XMLDoc].value('(/XMLDoc/Node/SubNode/SubSubNode)[1]','varchar(2000)') 
from XMLDoc 
where [XMLDoc].exist('/XMLDoc/Node/SubNode[1] [contains(SubSubNode[1],", ")]')=1 

很明顯,這將使用逗號來選擇所有值,而不是僅使用逗號來表示單個值。

任何協助將是偉大的。

回答

0

您是否想過使用上面的解析來構建某種派生列,其中包含來自您的SubNode元素的數據,然後使用基於SQL的解析函數來查找尾隨值是逗號的位置?

我剛剛使用了幾個不同的xml文檔來展示我的意思......您可以構建一個變體來查找與此模式匹配的行....不是用於查找模式的xquery技術,但應該管用。

DECLARE @XML XML = '<XMLDoc xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.xxx.xxx.xxx"> 
    <Node> 
    <SubNode> 
     <SubSubNode>Value, Value,</SubSubNode> 
     <IrrelevantNode></IrrelevantNode> 
    </SubNode> 
    </Node> 
    </XMLDoc>' 

DECLARE @XML2 XML = '<XMLDoc xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.xxx.xxx.xxx"> 
    <Node> 
    <SubNode> 
     <SubSubNode>Value</SubSubNode> 
     <IrrelevantNode></IrrelevantNode> 
    </SubNode> 
    </Node> 
    </XMLDoc>' 

DECLARE @xmlTbl TABLE(XmlDoc VARCHAR(MAX)) 


;with xmlnamespaces(default 'http://schemas.xxx.xxx.xxx') 
Insert Into @xmlTbl 
select @XML.value('(/XMLDoc/Node/SubNode/SubSubNode)[1]','varchar(2000)'); 

;with xmlnamespaces(default 'http://schemas.xxx.xxx.xxx') 
Insert Into @xmlTbl 
select @XML2.value('(/XMLDoc/Node/SubNode/SubSubNode)[1]','varchar(2000)') 

Select * 
From @xmlTbl 
Where RIGHT(XmlDoc,1) = ','