Sql-Server
XQuery 不更新 XML 數據
我正在嘗試執行腳本來更新 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