Updategram 簡介 (SQLXML 4.0)

適用于:SQL Server (Azure SQL資料庫的所有 支援版本)

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

OPENXML 函數可透過切割現有的 XML 文件,並提供可以傳遞到 INSERT、UPDATE 或 DELETE 陳述式之資料列集來修改資料庫。 利用 OPENXML,可以針對資料庫資料表直接執行作業。 因此,每當資料列集提供者 (例如資料表) 可以當做來源顯示時,OPENXML 最適合。

Updategram 跟 OPENXML 一樣,可讓您在資料庫中插入、更新或刪除資料,不過,Updategram 會根據註解式 XSD (或 XDR) 結構描述提供的 XML 檢視運作,例如,更新會套用到對應結構描述提供的 XML 檢視。 對應結構描述會依序擁有將 XML 元素和屬性對應到對應的資料庫資料表和資料行的必要資訊。 Updategram 會使用此對應資訊來更新資料庫資料表和資料行。

注意

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

Updategram 中的必要命名空間

updategram 中的關鍵字,例如< sync >< before >< after >,都存在於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>  

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

<之前>
識別記錄執行個體的目前狀態 (也稱為「之前的狀態」)。

<後>
識別所要變更資料的新狀態。

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

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

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

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

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

指定 Updategram 中的對應結構描述

在 Updategram 中,對應結構描述 (同時支援 XSD 和 XDR 結構描述) 提供的 XML 摘要可以是隱含的或明確的 (也就是說,Updategram 可以選擇是否搭配指定的對應結構描述使用)。 如果您未指定對應架構,updategram 會假設隱含對應 (預設對應) ,其中區塊之前 > 或之後區塊中的每個元素都會對應至資料表,而每個元素的子項目 <或屬性都會對應至資料庫中的資料行。>< 如果您明確地指定對應結構描述,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屬性所組成。 這些屬性是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)