Sql-Server

XQuery 不更新 XML 數據

  • May 15, 2019

我正在嘗試執行腳本來更新 XML 列:

UPDATE DataImpTable
SET serviceData.modify('replace value of (/SMObjInfo/CentralData/SMData/CentralSDItem/ControlData/text())[1] with "9876"')
WHERE identifier=5
<SMObjInfo xmlns="DataService/1.0.0.0" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
 <CentralData>
   <SMData>
     <CentralSDItem>
       <ControlData>1234</ControlData>
     </CentralSDItem>
   </SMData>
 </CentralData>
</SMObjInfo>

將值更改ControlData為 9876,但該值在 XML 中似乎沒有更改/SMObjInfo/CentralData/SMData/CentralSDItem/ControlData

它與類型化和非類型化 XML 有關嗎?

您需要在modify函式中聲明命名空間。

像這樣的東西:

DECLARE @xml xml = N'<SMObjInfo xmlns="DataService/1.0.0.0" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
 <CentralData>
   <SMData>
     <CentralSDItem>
       <ControlData>1234</ControlData>
     </CentralSDItem>
   </SMData>
 </CentralData>
</SMObjInfo>';
SET @xml.modify('
   declare default element namespace "DataService/1.0.0.0";
   replace value of (/SMObjInfo/CentralData/SMData/CentralSDItem/ControlData/text())[1]
   with "6789"
   ');
PRINT CONVERT(nvarchar(max), @xml);

在您的原始 xml 片段中,您聲明了以下從未使用過的命名空間:

xmlns:i="http://www.w3.org/2001/XMLSchema-instance"

如果您的實際 xml 文件確實使用了此命名空間,並且您想要修改這些元素,則需要將以下聲明添加到@xml.modify函式中:

declare namespace i="http://www.w3.org/2001/XMLSchema-instance";

結果(為便於閱讀而格式化):

<SMObjInfo xmlns="DataService/1.0.0.0" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
   <CentralData>
       <SMData>
           <CentralSDItem>
               <ControlData>6789</ControlData>
           </CentralSDItem>
       </SMData>
   </CentralData>
</SMObjInfo>

我寫了一篇關於修改函式的部落格文章,以及SQLServerScience.com上的更多範例

如果表中有 XML,則應使用 UPDATE 而不是 SET,並且可以使用WITH XMLNAMESPACES將命名空間聲明放在 XML_DML 表達式之外。

with xmlnamespaces(default 'DataService/1.0.0.0')
update DataImpTable
set serviceData.modify('replace value of (/SMObjInfo/CentralData/SMData/CentralSDItem
                                           /ControlData/text())[1] with "9876"')
where identifier=5

引用自:https://dba.stackexchange.com/questions/238013