共用方式為


Updategram 簡介 (SQLXML 4.0)

您可以在 MicrosoftSQL 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> 元素是由 FirstNameLastName 屬性所組成。這些屬性 (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 命令提交它。