Zine.net online

Witaj na Zine.net online Zaloguj się | Rejestracja | Pomoc
w Szukaj

dev2dev

Walidacja daty w schemacie XML w SQL Server 2005

Tworzę komunikację między Service Broker'ami działającymi na odległych instancjach serwerów i na dodatek działajacymi na dwóch wersjach (2005 i 2008). Budując ich infrastrukturę postanowiłem stworzyć typy komunikatów z walidacją opartą o schematy XSD.
Powiedzmy, że stworzyłem sobie typizowany dokument XML w SQL Server 2005. Niech ten dokument ma następujący kształt:

<Doc Id="837453847598" Date="2010-10-17T15:47:14.140">
    <Items>
        <Item>
            <Whatever>:-)</Whatever>
        </Item>
    </Items>
</Doc>


Do tego dokumentu wygenerowałem stosowną schema collection:

create xml schema collection MojaSchema as N'
<xs:schema attributeFormDefault="unqualified"
           elementFormDefault="qualified"
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:sql="http://schemas.microsoft.com/sqlserver/2004/sqltypes">
    <xs:element name="Doc">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Items">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="Item">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element name="Whatever" type="xs:string"  />
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
            <xs:attribute name="Id" type="xs:unsignedLong" use="required" />
            <xs:attribute name="Date" type="xs:dateTime" sql:DbType="datetime" use="required" />
        </xs:complexType>
    </xs:element>
</xs:schema>'

I teraz pozostało nam utworzyć typizowany obiekt XML zgodny z tym schema collection:

declare @xml xml(MojaSchema)

set @xml = N'
<Doc Id="837453847598" Date="
2010-10-17T15:47:14.140">
    <Items>
        <Item>
            <Whatever>:-)</Whatever>
        </Item>
    </Items>
</Doc>'


I tu czeka nas niemiła niespodzianka:

Msg 6926, Level 16, State 1, Line 2
XML Validation: Invalid simple type value: '2010-10-17T00:00:00.000'. Location: /*:Doc[1]/@*:Date


Problem wynika z błędu walidacji względem typu xs:datetime w wersji 2005 (w wersji 2008 nie ma tego problemu).
Aby nastąpiła poprawna walidacja wartość atrybuty Date powinna być z określeniem timezone.
Ale funkcje datetime w wersji 2005 nie obsługują timezone natomiast w wersji 2008 i owszem obsługują (datetimeoffset), tylko nie walidują się z typem xs:dateTime a i nie konwertują się do typu datetime po stronie wersji 2005. Nic tylko pisać własną obsługę timezone.
Opublikowane 17 października 2010 11:26 przez marekpow

Komentarze:

Brak komentarzy
Komentarze anonimowe wyłączone
W oparciu o Community Server (Personal Edition), Telligent Systems