XML 大量載入的指導方針和限制 (SQLXML 4.0)
當您使用 XML 大量載入時,應該熟悉下列指導方針和限制:
不支援內嵌架構。
如果您在來源 XML 檔中有內嵌架構,XML 大量載入會忽略該架構。 您可以指定 XML 資料外部 XML 大量載入的對應架構。 您無法使用 xmlns=“x:schema” 屬性來指定節點的對應架構。
XML 檔案會檢查格式良好,但未驗證。
XML 大量載入會檢查 XML 檔,以判斷它的格式是否正確,也就是確保 XML 符合萬維網聯盟 XML 1.0 建議的語法需求。 如果檔案格式不正確,XML 大量載入會取消處理並傳回錯誤。 唯一的例外狀況是當檔是片段時(例如,文件沒有單一根元素),在此情況下,XML 大量載入會載入檔。
XML 大量載入不會驗證檔與 XML 資料檔案內定義或參考的任何 XML-Data 或 DTD 架構有關。 此外,XML 大量載入不會根據提供的對應架構來驗證 XML 數據檔。
會忽略任何 XML 初構資訊。
XML 大量載入會忽略 XML 檔中根>元素前後<的所有資訊。 例如,XML 大量載入會忽略任何 XML 宣告、內部 DTD 定義、外部 DTD 參考、批註等等。
如果您有定義兩個數據表之間主鍵/外鍵關聯性的對應架構(例如 Customer 與 CustOrder 之間),則必須先在架構中描述具有主鍵的數據表。 具有外鍵數據行的數據表必須稍後出現在架構中。 這是因為在架構中識別數據表的順序是用來將它們載入資料庫的順序。例如,下列 XDR 架構會在 XML 大量載入中使用時產生錯誤,因為 <Order> 元素會在 Customer> 元素之前<描述。 CustOrder 中的 CustomerID 數據行是外鍵數據行,參考 Cust 數據表中的 CustomerID 主鍵數據行。
<?xml version="1.0" ?> <Schema xmlns="urn:schemas-microsoft-com:xml-data" xmlns:dt="urn:schemas-microsoft-com:xml:datatypes" xmlns:sql="urn:schemas-microsoft-com:xml-sql" > <ElementType name="Order" sql:relation="CustOrder" > <AttributeType name="OrderID" /> <AttributeType name="CustomerID" /> <attribute type="OrderID" /> <attribute type="CustomerID" /> </ElementType> <ElementType name="CustomerID" dt:type="int" /> <ElementType name="CompanyName" dt:type="string" /> <ElementType name="City" dt:type="string" /> <ElementType name="root" sql:is-constant="1"> <element type="Customers" /> </ElementType> <ElementType name="Customers" sql:relation="Cust" sql:overflow-field="OverflowColumn" > <element type="CustomerID" sql:field="CustomerID" /> <element type="CompanyName" sql:field="CompanyName" /> <element type="City" sql:field="City" /> <element type="Order" > <sql:relationship key-relation="Cust" key="CustomerID" foreign-key="CustomerID" foreign-relation="CustOrder" /> </element> </ElementType> </Schema>
如果架構未使用 sql:overflow-field 註釋來指定溢位數據行,XML 大量載入會忽略 XML 檔中出現但未在對應架構中描述的任何數據。
XML 大量載入會套用您在 XML 資料流中遇到已知標籤時所指定的對應架構。 它會忽略 XML 檔中的數據,但不會在架構中描述。 例如,假設您有描述 Customer> 元素的<對應架構。 XML 數據檔具有 AllCustomers> 根標記(架構中未描述),其包含所有< Customer> 元素:<
<AllCustomers> <Customer>...</Customer> <Customer>...</Customer> ... </AllCustomers>
在此情況下,XML 大量載入會<忽略 AllCustomers> 元素,並開始在 Customer> 元素進行<對應。 XML 大量載入會忽略架構中未描述但存在於 XML 檔中的專案。
請考慮另一個包含 Order> 元素的 <XML 源數據檔。 對應架構中不會描述這些元素:
<AllCustomers> <Customer>...</Customer> <Order> ... </Order> <Order> ... </Order> ... <Customer>...</Customer> <Order> ... </Order> <Order> ... </Order> ... ... </AllCustomers>
XML 大量載入會忽略這些 <Order> 元素。 但是,如果您使用 架構中的 sql:overflow-field批注,將數據行識別為溢位數據行,XML 大量載入會將所有未處理的數據儲存在此數據行中。
CDATA 區段和實體參考會在儲存在資料庫中之前,轉譯成其字串對等專案。
在此範例中,CDATA 區段會包裝 City> 元素的值<。 XML 大量載入會在將 City> 元素插入<資料庫之前,先擷取字串值 (“NY”)。
<City><![CDATA[NY]]> </City>
XML 大量載入不會保留實體參考。
如果對應架構指定屬性的預設值,且 XML 源數據不包含該屬性,XML 大量載入會使用預設值。
下列範例 XDR 架構會將預設值指派給 HireDate 屬性:
<?xml version="1.0" ?> <Schema xmlns="urn:schemas-microsoft-com:xml-data" xmlns:dt="urn:schemas-microsoft-com:xml:datatypes" xmlns:sql="urn:schemas-microsoft-com:xml-sql" > <ElementType name="root" sql:is-constant="1"> <element type="Customers" /> </ElementType> <ElementType name="Customers" sql:relation="Cust3" > <AttributeType name="CustomerID" dt:type="int" /> <AttributeType name="HireDate" default="2000-01-01" /> <AttributeType name="Salary" /> <attribute type="CustomerID" sql:field="CustomerID" /> <attribute type="HireDate" sql:field="HireDate" /> <attribute type="Salary" sql:field="Salary" /> </ElementType> </Schema>
在此 XML 數據中,第二個 <Customers> 元素中遺漏 HireDate 屬性。 當 XML 大量載入將第二個 <Customers> 元素插入資料庫時,它會使用架構中指定的預設值。
<ROOT> <Customers CustomerID="1" HireDate="1999-01-01" Salary="10000" /> <Customers CustomerID="2" Salary="10000" /> </ROOT>
不支援 sql:url 編碼批注:
您無法在 XML 數據輸入中指定 URL,並預期大量載入會從該位置讀取數據。
系統會建立對應架構中所識別的數據表(資料庫必須存在)。 如果資料庫中已有一或多個數據表,SGDropTables 屬性會判斷是否要卸除並重新建立這些預先存在的數據表。
如果您指定 SchemaGen 屬性 (例如 SchemaGen = true),則會建立對應架構中所識別的數據表。 但是 SchemaGen 不會在這些數據表上建立任何條件約束(例如 PRIMARY KEY/FOREIGN KEY 條件約束),但有一個例外:如果構成關聯性中主鍵的 XML 節點定義為具有 XML 類型的標識碼(也就是 XSD 的 type=“xsd:ID” ),且 SGUseID 屬性設定為 True,則 SchemaGen 的 SGUseID 屬性會設定為 True, 然後,不僅會從標識符具類型的節點建立主鍵,而且會從對應架構關聯性建立主鍵/外鍵關聯性。
SchemaGen 不會使用 XSD 架構 Facet 和延伸模組來產生關係型 SQL Server 架構。
如果您在大量載入上指定 SchemaGen 屬性 (例如 SchemaGen = true),則只會更新指定的資料表(而非共用名稱檢視表)。
SchemaGen 僅提供從批注 XSD 產生關係架構的基本功能。 如有需要,用戶應該手動修改產生的數據表。
在數據表之間存在一個以上的關聯性時,SchemaGen 會嘗試建立單一關聯性,其中包含兩個數據表之間涉及的所有索引鍵。 這項限制可能是 Transact-SQL 錯誤的原因。
當您將 XML 數據大量載入資料庫中時,對應架構中必須至少有一個屬性或子元素對應至資料庫數據行。
如果您使用 XML 大量載入來插入日期值,則必須以 (-)CCYY-MM-DD(+-)TZ) 格式指定值。 這是日期的標準 XSD 格式。
某些屬性旗標與其他屬性旗標不相容。 例如,大量載入不支援 Ignoreduplicatekeys=true ,以及 Keepidentity=false。 當 Keepidentity=false 時,大量載入會預期伺服器會產生索引鍵值。 數據表在索引鍵上應該有 IDENTITY 條件約束。 伺服器不會產生重複的索引鍵,這表示不需要 將 Ignoreduplicatekeys 設定為 true。 只有在將主鍵值從傳入數據上傳至具有數據列且可能發生主鍵值衝突的數據表時,才應該將 Ignoreduplicatekeys 設定為 true 。