Updategram 簡介 (SQLXML 4.0)
您可以在 Microsoft SQL Server 中使用 Updategram 或 OPENXML Transact-SQL 函數,從現有的 XML 文件修改 (插入、更新或刪除) 資料庫。
OPENXML 函數可透過切割現有的 XML 文件,並提供可以傳遞到 INSERT、UPDATE 或 DELETE 陳述式之資料列集來修改資料庫。 利用 OPENXML,可以針對資料庫資料表直接執行作業。 因此,每當資料列集提供者 (例如資料表) 可以當做來源顯示時,OPENXML 最適合。
Updategram 跟 OPENXML 一樣,可讓您在資料庫中插入、更新或刪除資料,不過,Updategram 會根據註解式 XSD (或 XDR) 結構描述提供的 XML 檢視運作,例如,更新會套用到對應結構描述提供的 XML 檢視。 對應結構描述會依序擁有將 XML 元素和屬性對應到對應的資料庫資料表和資料行的必要資訊。 Updategram 會使用此對應資訊來更新資料庫資料表和資料行。
[!附註]
本文件集假設您非常熟悉 SQL Server 中的範本和對應結構描述支援。 如需詳細資訊,請參閱<註解式 XSD 結構描述簡介 (SQLXML 4.0)>。 如需了解使用 XDR 的舊版應用程式,請參閱<註解式 XDR 結構描述 (在 SQLXML 4.0 中已被取代)>。
Updategram 中的必要命名空間
Updategram 中的關鍵字 (例如,<sync>、<before> 和 <after>) 存在於 urn:schemas-microsoft-com:xml-updategram 命名空間中。 您使用的命名空間前置詞是任意的。 在此文件集中,updg 前置詞代表 updategram 命名空間。
檢閱語法
Updategram 是一個包含 <sync>、<before> 和 <after> 區塊的範本,可形成 Updategram 的語法。 下列程式碼以其簡單的形式顯示此語法:
<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync [mapping-schema= "AnnotatedSchemaFile.xml"] >
<updg:before>
...
</updg:before>
<updg:after>
...
</updg:after>
</updg:sync>
</ROOT>
下列定義描述每個區塊的角色:
<before>
識別記錄執行個體的目前狀態 (也稱為「之前的狀態」)。<after>
識別所要變更資料的新狀態。<sync>
包含 <before> 和 <after> 區塊。 一個 <sync> 區塊可以包含一組以上的 <before> 和 <after> 區塊。 如果有一組以上的 <before> 和 <after> 區塊,必須成對指定這些區塊 (即使它們是空的)。 此外,一個 Updategram 可以有一個以上的 <sync> 區塊。 每個 <sync> 區塊都是一個交易單位 (表示已執行 <sync> 區塊中的每個項目或沒有執行任何項目)。 若您在 Updategram 中指定多個 <sync> 區塊,則一個 <sync> 區塊的失敗不會影響其他的 <sync> 區塊。
Updategram 是否要刪除、插入或更新記錄執行個體,取決於 <before> 與 <after> 區塊的內容:
如果記錄執行個體只顯示在 <after> 區塊中沒有對應執行個體的 <before> 區塊中,則 Updategram 會執行刪除作業。
如果記錄執行個體只顯示在 <before> 區塊中沒有對應執行個體的 <after> 區塊中,則它是一個插入作業。
如果記錄執行個體顯示在 <before> 區塊中,而且在 <after> 區塊中有一個對應的執行個體,則它是一個更新作業。 在此情況下,Updategram 會將記錄執行個體更新成 <after> 區塊中指定的值。
指定 Updategram 中的對應結構描述
在 Updategram 中,對應結構描述 (同時支援 XSD 和 XDR 結構描述) 提供的 XML 摘要可以是隱含的或明確的 (也就是說,Updategram 可以選擇是否搭配指定的對應結構描述使用)。 如果沒有指定對應結構描述,Updategram 會假設為隱含的對應 (預設對應),其中,<before> 區塊或 <after> 區塊中的每個元素都會對應到資料表,而每個元素的子元素或屬性都會對應到資料庫中的資料行。 如果您明確地指定對應結構描述,Updategram 中的元素和屬性必須符合對應結構描述中的元素和屬性。
隱含的 (預設) 對應
在多數情況下,執行簡單更新的 Updategram 可能不需要對應結構描述。 在此情況下,Updategram 會依賴預設對應結構描述。
下列 Updategram 示範隱含的對應。 在這個範例中,Updategram 會在 Sales.Customer 資料表中插入新客戶。 此 Updategram 使用隱含的對應,因此,<Sales.Customer> 元素會對應到 Sales.Customer 資料表,而 CustomerID 和 SalesPersonID 屬性會對應到 Sales.Customer 資料表中的對應資料行。
<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync >
<updg:before>
</updg:before>
<updg:after>
<Sales.Customer CustomerID="1" SalesPersonID="277" />
</updg:after>
</updg:sync>
</ROOT>
明確的對應
如果您指定對應結構描述 (XSD 或 XDR),Updategram 會使用結構描述來判斷要更新的資料庫資料表和資料行。
如果 Updategram 執行複雜的更新 (例如,根據在對應結構描述中指定的父子式關聯性,將記錄插入多個資料表),您必須使用 Updategram 執行所依據的 mapping-schema 屬性,明確地提供對應結構描述。
由於 Updategram 是一個範本,因此,在 Updategram 中針對對應結構描述所指定的路徑是範本檔位置的相對路徑 (相對於儲存 Updategram 的位置)。 如需詳細資訊,請參閱<在 Updategram 中指定註解式對應結構描述 (SQLXML 4.0)>。
Updategram 中的元素中心及屬性中心對應
利用預設對應 (在 Updategram 中未指定對應結構描述時),Updategram 元素會對應到資料表,而子元素 (如果是元素中心對應) 和屬性 (如果是屬性中心對應) 則會對應到資料行。
元素中心的對應
在元素中心的 Updategram 中,一個元素包含表示元素屬性的多個子元素。 例如,請參閱下列 Updategram。 <Person.Contact> 元素包含 <FirstName> 和 <LastName> 子元素。 這些子元素是 <Person.Contact> 元素的屬性。
此 Updategram 不會指定對應的結構描述,因此 Updategram 會使用隱含的對應,其中 <Person.Contact> 元素會對應到 Person.Contact 資料表,而其子元素則會對應到 FirstName 和 LastName 資料行。
<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync >
<updg:after>
<Person.Contact>
<FirstName>Catherine</FirstName>
<LastName>Abel</LastName>
</Person.Contact>
</updg:after>
</updg:sync>
</ROOT>
屬性中心的對應
在屬性中心的對應中,元素擁有屬性。 下列 Updategram 使用屬性中心的對應。 在此範例中,<Person.Contact> 元素是由 FirstName 和 LastName 屬性所組成。 這些屬性 (Attribute) 是 <Person.Contact> 元素的屬性 (Property)。 如同在先前的範例中,此 Updategram 不會指定對應的結構描述,因此,它會依賴隱含的對應,將 <Person.Contact> 元素對應到 Person.Contact 資料表,並將元素的屬性對應到資料表中的個別資料行。
<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync >
<updg:before>
</updg:before>
<updg:after>
<Person.Contact FirstName="Catherine" LastName="Abel" />
</updg:after>
</updg:sync>
</ROOT>
同時使用元素中心和屬性中心的對應
您可以指定混用的元素中心與屬性中心對應,如下列 Updategram 所示。 請注意,<Person.Contact> 元素同時包含屬性和子元素。 同時,這個 Updategram 依賴隱含的對應。 因此,FirstName 屬性和 <LastName> 子元素會對應到 Person.Contact 資料表中的對應資料行。
<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync >
<updg:before>
</updg:before>
<updg:after>
<Person.Contact FirstName="Catherine" >
<LastName>Abel</LastName>
</Person.Contact>
</updg:after>
</updg:sync>
</ROOT>
使用在 SQL Server 有效,但在 XML 無效的字元
在 SQL Server 中,資料表名稱可以包含一個空格。 不過,此種類型的資料表名稱在 XML 中無效。
若要編碼屬於有效 SQL Server 識別碼,卻不屬於有效 XML 識別碼的字元,請使用 '__xHHHH__' 當做編碼值,其中 HHHH 代表在最大顯著性位元第一順序下,該字元的四位數十六進位 UCS-2 代碼。 使用此編碼配置時,空格字元會取代成 x0020 (空格字元的四位數十六進位碼),因此,SQL Server 中的資料表名稱 [Order Details] 在 XML 中會變成 _x005B_Order_x0020_Details_x005D_。
同樣地,您可能需要指定三部分的元素名稱,例如 <[database].[owner].[table]>。 由於方括號字元 ([ 和 ]) 在 XML 中無效,因此,您必須將此指定為 <_x005B_database_x005D_._x005B_owner_x005D_._x005B_table_x005D_>,其中 _x005B_ 是左方括號 ([) 的編碼,而 _x005D_ 是右方括號 (]) 的編碼。
執行 Updategram
Updategram 是一個範本,因此,範本的所有處理機制都會套用到 Updategram。 對於 SQLXML 4.0,您可以利用下列任一種方式執行 Updategram:
在 ADO 命令中提交它。
當做 OLE DB 命令提交它。