| 模式 | 行為 | 適用場景 |
|---|---|---|
| strict | 元素必須在 Schema 中定義且驗證通過 | 核心業務資料、嚴格契約 |
| lax | 若 Schema 中有定義則驗證,否則略過 | 可擴充介面、第三方擴展、版本演進 |
| skip | 完全不驗證內容 | 完全開放的擴充區塊、原始資料保存 |
基礎 Schema(OrderBase.xsd):
<xs:schema targetNamespace="https://example.com/order"
xmlns:xs="https://www.w3.org/2001/XMLSchema"
xmlns:ord="https://example.com/order"
elementFormDefault="qualified">
<xs:complexType name="OrderType">
<xs:sequence>
<xs:element name="Buyer" type="xs:string"/>
<xs:element name="Amount" type="xs:decimal"/>
<xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:element name="Order" type="ord:OrderType"/>
</xs:schema>
擴充 Schema(ShippingExt.xsd):
<xs:schema targetNamespace="https://example.com/shipping"
xmlns:xs="https://www.w3.org/2001/XMLSchema"
xmlns:shp="https://example.com/shipping"
elementFormDefault="qualified">
<xs:element name="DeliveryMethod" type="xs:string"/>
<xs:element name="TrackingNo" type="xs:string"/>
</xs:schema>
XML 實例:
<ord:Order xmlns:ord="https://example.com/order"
xmlns:shp="https://example.com/shipping">
<ord:Buyer>John</ord:Buyer>
<ord:Amount>199.00</ord:Amount>
<shp:DeliveryMethod>Express</shp:DeliveryMethod>
<shp:TrackingNo>TRK12345</shp:TrackingNo>
<crm:CustomerTier>Gold</crm:CustomerTier>
</ord:Order>
結果:前兩個擴充元素通過型別驗證,第三個 crm:CustomerTier 因無對應 Schema 而被 Lax 模式接受。
XSD 規格規定 xs:anyType 等同於 processContents="lax"。SQL Server 2005 錯誤採用 Strict 處理,導致合法的混合內容被拒絕。2008 修正此行為:
<xs:element name="FreeForm" type="xs:anyType"/>
現在可接受任意 Well-formed XML 片段,若其中元素有 Schema 定義則自動驗證。
-- 2005 行為
DECLARE @x2005 XML = ' ';
SELECT @x2005.value('(/Root/Time)[1]', 'datetime'); -- 2007-12-25 14:00:00.000 (UTC)
-- 2008 行為
DECLARE @x2008 XML = ' ';
SELECT @x2008.value('(/Root/Time)[1]', 'datetimeoffset'); -- 2007-12-25 06:00:00.0000000 -08:00
| XSD 型別 | SQL Server 2008 對應型別 | 時區保留 |
|---|---|---|
| xs:dateTime | datetimeoffset | 是 |
| xs:date | date | 是(可選時區) |
| xs:time | time | 是(可選時區) |
注意:若目標欄位為舊型別 datetime,仍會轉換為 UTC;需明確使用 datetimeoffset 才能保留時區。
<AvailableSizes></AvailableSizes>(空內容)→ 合法(空列表)
<AvailableSizes> </AvailableSizes>(空白)→ 合法(空白會被標準化移除)
驗證時依 memberTypes 宣告順序嘗試匹配,首個匹配成功即通過。建議將限制較嚴格的型別放在前面。
sys.xml_schema_collections 完整性檢查。xs:any 的 Schema,建立測試資料集驗證 Lax 行為是否符合預期。