SQL Serverの強く型付けされたxml要素の値をXQueryに置き換えます


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

しかし、これは次のエラーを生成します:

メッセージ9301、レベル16、状態1、行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

私はこのエラーを受け取ります:

メッセージ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 'elements、found'(element(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 [modify()]:値のタイプは「xs:string」であり、予期されるタイプ「<anonymous>」のサブタイプではありません。

1つの回避策は、名前付きの単純型を使用するようにスキーマを変更し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?');

もう1つの方法は、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.