SQL सर्वर में XQuery के साथ जोरदार टाइप किए गए xml तत्व का मान बदलें


10

एक तत्व को देखते हुए, XML स्कीमा संग्रह में इस प्रकार परिभाषित किया गया है:

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

आप XQuery का उपयोग करके तत्व को कैसे अपडेट करेंगे?

तत्व स्कीमा संग्रह में 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

लेकिन यह निम्नलिखित त्रुटि उत्पन्न करता है:

Msg 9301, Level 16, State 1, Line 2 XQuery [cm.item.data.modify ()]: सर्वर के इस संस्करण में, 'कास्ट के रूप में' उपलब्ध नहीं है। कृपया 'कास्ट के रूप में उपयोग करें?' वाक्य - विन्यास।

यदि मैं पूरी तरह से कास्ट हटा देता हूं और इस क्वेरी का उपयोग करता हूं:

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

मुझे यह त्रुटि मिली:

Msg 2247, Level 16, State 1, Line 2 XQuery [cm.item.data.modify ()]: मान "xs: string" प्रकार का है, जो अपेक्षित प्रकार "<गुमनाम>" का उपप्रकार नहीं है।

यदि मैं यह प्रश्न जारी करता हूं:

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

मुझे यह त्रुटि मिली:

Msg 9312, स्तर 16, राज्य 1, पंक्ति 2 XQuery [cm.item.data.modify ()]: 'पाठ ()' सरल टाइप किए गए या ' http://www.w3.org/2001/XMLSchema ' पर समर्थित नहीं है #anyType 'तत्व, पाया गया' (तत्व (ns { http://www.anon.com/ }: xid, # अनाम;)) * '।

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

परिणाम:

Msg 2247, Level 16, State 1, Line 25 XQuery [संशोधित] (): मान "xs: string" प्रकार का है, जो अपेक्षित प्रकार "<अनाम>" का उपप्रकार नहीं है।

एक वर्कअराउंड अपने स्कीमा को नामांकित सरल प्रकार का उपयोग करने के लिए संशोधित करना 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?');

एक और तरीका यह है कि एक्सएमएल को बिना छपे एक्सएमएल वेरिएबल से निकाला जाए, वेरिएबल में बदलाव कर उसे वापस टेबल पर रखा जाए।

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;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.