Updategrams 簡介 (SQLXML 4.0)

適用於:SQL ServerAzure SQL 資料庫

您可以使用 updategram 或 OPENXML Transact-SQL 函式,從現有的 XML 檔修改Microsoft SQL Server 中的資料庫(插入、更新或刪除)。

OPENXML 函式會藉由切割現有的 XML 檔,並提供可以傳遞至 INSERT、UPDATE 或 DELETE 語句的數據列集來修改資料庫。 透過OPENXML,作業會直接針對資料庫資料表執行。 因此,OPENXML 最適合數據列集提供者,例如數據表,可以顯示為來源的位置。

如同 OPENXML,Updategram 可讓您在資料庫中插入、更新或刪除數據;不過,Updategram 適用於批注式 XSD (或 XDR) 架構所提供的 XML 檢視;例如,更新會套用至對應架構所提供的 XML 檢視。 對應架構接著具有將 XML 元素和屬性對應至對應資料庫數據表和數據行的必要資訊。 Updategram 會使用此對應資訊來更新資料庫數據表和數據行。

注意

本檔假設您已熟悉 SQL Server 中的範本和對應架構支援。 如需詳細資訊,請參閱 批注式 XSD 架構簡介 (SQLXML 4.0) 。 如需使用 XDR 的舊版應用程式,請參閱批注式 XDR 架構(在 SQLXML 4.0 中已被取代)。

Updategram 中的必要命名空間

updategram 中的關鍵詞,例如 <同步>處理、 <之前><之後>,存在於 urn:schemas-microsoft-com:xml-updategram 命名空間中。 您使用的命名空間前置詞是任意的。 在本檔中, updg 前置詞代表 updategram 命名空間。

檢閱語法

Updategram 是具有 <同步>處理、 <之前><之後> 區塊的範本,可形成 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>  

下列定義描述每個區塊的角色:

<以前>
識別記錄實例的現有狀態(也稱為「之前狀態」)。

<後>
識別要變更數據的新狀態。

<sync>
包含區塊前後><>的 。< <同步>區塊可以包含多個區塊前後<>><集合。 如果區塊前後<>>有多個集合<,這些區塊(即使這些區塊是空的)必須指定為配對。 此外,Updategram 可以有多個 <同步> 區塊。 每個<同步>區塊都是一個交易單位(這表示同步>區塊中的<一切都已完成或未完成任何動作)。 如果您在 updategram 中指定多個<同步區塊,一個<同步>>區塊失敗並不會影響其他<同步>區塊。

Updategram 會刪除、插入或更新記錄實例,取決於區塊前後<>>的內容:<

  • 如果記錄實例只出現在前>一個區塊中<,而後>區塊中<沒有對應的實例,Updategram 就會執行刪除作業。

  • 如果記錄實例只出現在後>區塊中<,且前>一個區塊中<沒有對應的實例,則它是插入作業。

  • 如果記錄實例出現在<前>一個區塊中,並在區塊之後>有對應的實例<,則它是更新作業。 在此情況下,updategram 會將記錄實例更新為在 後>區塊中指定的<值。

在 Updategram 中指定對應架構

在 updategram 中,對應架構所提供的 XML 抽象概念(支援 XSD 和 XDR 架構)可以是隱含或明確的(也就是說,updategram 可以使用或不使用指定的對應架構)。 如果您未指定對應架構,updategram 會假設隱含對應(預設對應),其中區塊前>或<區塊之後>的每個元素<都會對應至數據表,而每個元素的子專案或屬性都會對應至資料庫中的數據行。 如果您明確指定對應架構,updategram 中的元素和屬性必須符合對應架構中的元素和屬性。

隱含 (預設) 對應

在大部分情況下,執行簡單更新的Updategram可能不需要對應架構。 在此情況下,updategram 依賴預設對應架構。

下列 Updategram 示範隱含對應。 在此範例中,updategram 會在 Sales.Customer 數據表中插入新的客戶。 由於此更新報使用隱含對應, <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 屬性所組成。< 這些屬性是 Person.Contact 元素的屬性<。> 如同上一個範例,這個 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 中的數據表名稱 [訂單詳細數據] 會變成 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 命令。

另請參閱

Updategram 安全性考慮 (SQLXML 4.0)