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 ()] :이 버전의 서버에서는 '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 '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>"의 하위 유형이 아닙니다.

한 가지 해결 방법은 명명 된 단순 유형을 사용하도록 스키마를 수정 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.