Thay thế giá trị của phần tử xml được gõ mạnh trong SQL Server bằng XQuery


10

Đưa ra một yếu tố, được định nghĩa trong Bộ sưu tập Lược đồ XML như sau:

<xsd:element name="xid">
    <xsd:simpleType>
        <xsd:restriction base="xsd:string">
            <xsd:maxLength value="32" />
        </xsd:restriction>
    </xsd:simpleType>
</xsd:element>

Làm thế nào bạn sẽ cập nhật phần tử bằng XQuery?

Phần tử được tìm thấy trong không gian tên ns trong bộ sưu tập lược đồ. Tôi đã cố gắng cập nhật phần tử truy vấn bên dưới:

update cm.item
   set data.modify(
    'declare namespace ns="http://www.anon.com"; 
     replace value of (/ns:*/ns:xid)[1] with "X00011793" cast as element(ns{http://www.anon.com}:xid,#anonymous) ?') 
 where id = 11793

nhưng điều này tạo ra lỗi sau:

Msg 9301, Cấp 16, Trạng thái 1, Dòng 2 XQuery [cm.item.data.modify ()]: Trong phiên bản này của máy chủ, 'cast as' không khả dụng. Vui lòng sử dụng 'cast as?' cú pháp.

Nếu tôi loại bỏ toàn bộ diễn viên và sử dụng truy vấn này:

update cm.item
   set data.modify(
    'declare namespace ns="http://www.anon.com"; 
     replace value of (/ns:*/ns:xid)[1] with "X00011793"') 
 where id = 11793

Tôi nhận được lỗi này:

Msg 2247, Cấp 16, Trạng thái 1, Dòng 2 XQuery [cm.item.data.modify ()]: Giá trị thuộc loại "xs: chuỗi", không phải là kiểu con của loại dự kiến ​​"<nặc danh>".

Nếu tôi đưa ra truy vấn này:

update cm.item
   set data.modify(
      'declare namespace ns="http://www.anon.com/"; 
       replace value of (/ns:*/ns:xid/text())[1] with "X00011793"')
 where id = 11793

Tôi nhận được lỗi này:

Msg 9312, Cấp 16, Trạng thái 1, Dòng 2 XQuery [cm.item.data.modify ()]: 'text ()' không được hỗ trợ trên cách gõ đơn giản hoặc ' http://www.w3.org/2001/XMLSchema #anyType 'phần tử, được tìm thấy' (phần tử (ns { http://www.anon.com/ }: xid, # nặc danh)?) * '.

Tôi đang nhắm mục tiêu SQL Server 2008 R2.

Cảm ơn!

Câu trả lời:


6

Tôi đã không tìm thấy một cách đơn giản để chỉ sửa đổi replace value ofcâu lệnh để làm việc với các định nghĩa loại đơn giản ẩn danh.

Lời trách móc đơn giản về những gì bạn có:

drop xml schema collection dbo.SimpleTypeTest;

go

create xml schema collection dbo.SimpleTypeTest as 
N'<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="root">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="xid">
                    <xs:simpleType>
                        <xs:restriction base="xs:string">
                            <xs:maxLength value="30"/>
                        </xs:restriction>
                    </xs:simpleType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>';

go

declare @X xml(document dbo.SimpleTypeTest) = '<root><xid>1</xid></root>';

set @X.modify('replace value of /root/xid  with "2"');

Kết quả:

Msg 2247, Cấp 16, Trạng thái 1, Dòng 25 XQuery [Sửa ()]: Giá trị thuộc loại "xs: chuỗi", không phải là kiểu con của loại dự kiến ​​"<nặc danh>".

Một cách giải quyết khác là sửa đổi lược đồ của bạn để sử dụng một loại đơn giản được đặt tên xidTypevà bỏ giá trị mới.

drop xml schema collection dbo.SimpleTypeTest;

go

create xml schema collection dbo.SimpleTypeTest as 
N'<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="root">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="xid" type="xidType"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:simpleType name="xidType">
        <xs:restriction base="xs:string">
            <xs:maxLength value="30"/>
        </xs:restriction>
    </xs:simpleType>
</xs:schema>';

go

declare @X xml(document dbo.SimpleTypeTest) = '<root><xid>1</xid></root>';

set @X.modify('replace value of /root/xid  with "2" cast as xidType?');

Một cách khác là trích xuất XML thành một biến XML chưa được đánh dấu, sửa đổi biến đó và đưa nó trở lại bảng.

drop xml schema collection dbo.SimpleTypeTest;

go

create xml schema collection dbo.SimpleTypeTest as 
N'<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="root">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="xid">
                    <xs:simpleType>
                        <xs:restriction base="xs:string">
                            <xs:maxLength value="30"/>
                        </xs:restriction>
                    </xs:simpleType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>';

go

declare @X xml(document dbo.SimpleTypeTest) = '<root><xid>1</xid></root>';
declare @X2 xml = @X;

set @X2.modify('replace value of (/root/xid/text())[1]  with "2"');
set @X = @X2;
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.