Updategram 簡介 (SQLXML 4.0)

適用於:SQL ServerAzure SQL Database

您可以使用 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中的範本和對應架構支援。 如需詳細資訊,請參閱批 注 XSD 架構簡介 (SQLXML 4.0) 。 如需使用 XDR 的繼承應用程式,請參閱 SQLXML 4.0 中已淘汰 (的批註 XDR 架構)

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 會執行刪除作業。

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

  • 如果記錄實例出現在之前 > 區塊中 <,並在之後 > 區塊中 <具有對應的實例,則它是更新作業。 在此情況下,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 中,一個元素包含表示元素屬性的多個子元素。 例如,請參閱下列 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)