แทนที่ค่าขององค์ประกอบ xml ที่พิมพ์อย่างยิ่งใน SQL Server ด้วย XQuery


10

ได้รับองค์ประกอบที่กำหนดไว้ภายในคอลเลกชัน XML Schema ดังกล่าว:

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

คุณจะอัพเดทองค์ประกอบโดยใช้ XQuery อย่างไร

องค์ประกอบที่พบในnamespace nsในคอลเลกชันคี ฉันพยายามอัปเดตองค์ประกอบข้อความค้นหาด้านล่าง:

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

แต่สิ่งนี้สร้างข้อผิดพลาดต่อไปนี้:

ข่าวสารเกี่ยวกับ 9301, ระดับ 16, สถานะ 1, บรรทัดที่ 2 XQuery [cm.item.data.modify ()]: ในเซิร์ฟเวอร์รุ่นนี้ไม่สามารถใช้ 'cast as' กรุณาใช้ 'cast as?' วากยสัมพันธ์

หากฉันลบตัวละครทิ้งทั้งหมดและใช้แบบสอบถามนี้:

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

ฉันได้รับข้อผิดพลาดนี้:

ข่าวสารเกี่ยวกับ 2247 ระดับ 16 สถานะ 1 บรรทัด 2 XQuery [cm.item.data.modify ()]: ค่าเป็นประเภท "xs: string" ซึ่งไม่ใช่ประเภทย่อยของประเภทที่คาดหวัง "<anonymous>"

ถ้าฉันออกแบบสอบถามนี้:

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

ฉันได้รับข้อผิดพลาดนี้:

ข่าวสารเกี่ยวกับ 9312, ระดับ 16, สถานะ 1, บรรทัด 2 XQuery [cm.item.data.modify ()]: 'text ()' ไม่ได้รับการสนับสนุนในการพิมพ์อย่างง่ายหรือ ' http://www.w3.org/2001/XMLSchema #anyType 'พบองค์ประกอบ' (องค์ประกอบ (ns { http://www.anon.com/ }: xid, # anonymous)?) * '

ฉันกำลังกำหนดเป้าหมายเป็น SQL Server 2008 R2

ขอบคุณ!

คำตอบ:


6

ฉันไม่พบวิธีง่ายๆในการปรับเปลี่ยนreplace value ofคำสั่งเพื่อทำงานกับคำจำกัดความประเภทอย่างง่ายที่ไม่ระบุชื่อ

ทำซ้ำสิ่งที่คุณมีง่ายๆ:

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

ผลลัพธ์:

ข่าวสารเกี่ยวกับ 2247, ระดับ 16, สถานะ 1, บรรทัดที่ 25 XQuery [แก้ไข ()]: ค่าเป็นประเภท "xs: string" ซึ่งไม่ใช่ประเภทย่อยของประเภทที่คาดไว้ "<anonymous>"

วิธีแก้ปัญหาหนึ่งคือการแก้ไขสคีมาของคุณเพื่อใช้ชนิดง่าย ๆ ที่กำหนดชื่อxidTypeแล้วส่งค่าใหม่

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

อีกวิธีหนึ่งคือการแยก XML ไปยังตัวแปร XML ที่ไม่ได้พิมพ์แก้ไขตัวแปรและนำกลับไปที่ตาราง

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;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.