XQuery không cập nhật dữ liệu XML


7

Tôi đang cố chạy tập lệnh để cập nhật cột 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>

Thay đổi giá trị ControlDatathành 9876 nhưng giá trị dường như không thay đổi trong XML đối với /SMObjInfo/CentralData/SMData/CentralSDItem/ControlDatagiá trị.

Có bất cứ điều gì để làm với XML đã gõ và chưa được gõ?

Câu trả lời:


11

Bạn sẽ cần khai báo các không gian tên trong modifyhàm.

Một cái gì đó như thế này:

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);

Trong đoạn xml ban đầu của bạn, bạn đã khai báo không gian tên sau đây không bao giờ được sử dụng:

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

Nếu các tài liệu xml thực tế của bạn sử dụng không gian tên này và bạn muốn sửa đổi các thành phần đó, bạn cần thêm khai báo sau vào @xml.modifyhàm:

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

Kết quả (được định dạng để dễ đọc):

<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>

Tôi đã viết một bài đăng trên blog về chức năng sửa đổi, cùng với một số ví dụ khác tại SQLServerScience.com


9

Nếu bạn có XML trong bảng, bạn nên sử dụng CẬP NHẬT thay vì SET và ở đó bạn có thể đặt khai báo không gian tên bên ngoài biểu thức XML_DML bằng cách sử dụng VỚI XMLNAMESPACES .

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.